答えは私の目の前にあるかもしれませんが、私はまだ分かりません。誰かがこれを私に説明した後、ダーウィンは私に電話をかけてくれると確信しています。デーモンプログラムがjoin()を使わずに終了しないのはなぜですか?
例はat this link hereですが、私は実験をして理解を助けるためにいくつかの変更を加えましたが、ここで
はコードです:
import multiprocessing
import time
import sys
def daemon():
p = multiprocessing.current_process()
print 'Starting: ', p.name, p.pid
sys.stdout.flush()
time.sleep(2)
print 'Exiting: ', p.name, p.pid
sys.stdout.flush()
def non_daemon():
p = multiprocessing.current_process()
print 'Starting: ', p.name, p.pid
sys.stdout.flush()
time.sleep(6)
print 'Exiting: ', p.name, p.pid
sys.stdout.flush()
if __name__ == '__main__':
d = multiprocessing.Process(name='daemon', target=daemon)
d.daemon = True
n = multiprocessing.Process(name='non-daemon', target=non_daemon)
n.daemon = False
d.start()
time.sleep(1)
n.start()
# d.join()
とコードの出力は次のとおりです。最後に()の参加がコメント解除された場合
Starting: daemon 6173
Starting: non-daemon 6174
Exiting: non-daemon 6174
、出力は次のとおりです。
Starting: daemon 6247
Starting: non-daemon 6248
Exiting: daemon 6247
Exiting: non-daemon 6248
デーモンのスリープが2秒であるのに対し、デーモン以外のデーモンは6秒ですが、私は混乱しています。最初のケースで「終了」メッセージが表示されないのはなぜですか?デーモンは非デーモンの前に目を覚まし、メッセージを表示する必要があります。
サイトからの説明のようなある:
出力(メイン プログラムを含む)は、非デーモンプロセスの全てので、デーモン プロセスから「終了」メッセージが含まれていませんデーモンプロセスが2秒後にスリープ状態になる前に終了する。 スリープ。
しかし、非デーモンの前にデーモンが起動するように変更しました。私はここで何が欠けていますか?あなたの助けを前にありがとう。
編集:私のpython 2.7を使用しています言及し忘れたが、どうやらこの問題は、これが追跡するのも楽しいものだったのPython 3.xの
これはバグであると判断しました。(スレッドの代わりにプロセスを使って 'マルチプロセッシング'がエミュレートされると思われる) 'threading'とは異なり、デーモンスレッドは動作し続けます。もしくはそうでないか)。 [bug#26633](https://bugs.python.org/issue26633)を開きました。 – ShadowRanger
この問題を調査する上で、そしてそれを上回ることのために。私が狂っていないとダーウィンは私のために呼び出すことはありません聞いてうれしい、少なくとも今回は=) – Classified