最近Pythonでマルチプロセッシングを使用するときにゾンビプロセスに問題があります。Pythonカーネル終了時の多重処理ゾンビを防ぐ方法
私はいくつかのプロセス(ワーカー)と別のプロセス(プリンタ)を作成するスクリプトを持っています。作業者はmsgsをキューに生成し、プリンタはすべてのmsgをキューに出力する必要があります。
問題は通常、労働者は何時間も働く必要があるということです。しかし、スクリプトを起動した後で、コードを変更してスクリプトを再起動したいことがあります。仕事が終わるまで待つと、join()を使っているのでゾンビはありません。しかし、カーネルを直接シャットダウンすると(Ctrl + Cキーは私のスパイダーでは機能しないので)、すべてのプロセス(ゾンビ)はまだ動作しています。
os.ppid
を使用しようとしましたが、ppidが変更されていないようです。 p.daemon = True
を試しましたが、どちらも動作しません。
私は、カーネルをシャットダウンすると、すべてのプロセスが終了し、システムにゾンビがないことを確認する方法があるのか質問したいと思います。
おかげで、サンプルコードは次のとおりです。
from multiprocessing import Process, Queue
import time
def f(num, q):
for i in range(100):
q.put('f: num=%d\n'% (num,))
time.sleep(10)
def g(q, filename):
while True:
with open(filename, 'a') as f:
if q.qsize() > 0:
item = q.get()
if item == None:
break
else:
f.write(item)
def main():
filename = './log.txt'
q = Queue()
workers = [Process(target=f, args=(i,q)) for i in range(10)]
printer = Process(target=g, args=(q,filename))
for p in workers:
p.daemon = True
p.start()
printer.daemon = True
printer.start()
for p in workers:
p.join()
q.put(None)
printer.join()
if __name__ == '__main__':
main()
「カーネルをシャットダウンする」とはどういう意味ですか?どのコマンドを実際に発行しますか? – noxdafox
実際、私はSpyder IDEを使用し、Ipythonコンソールでは「現在のコマンドを停止する」、Pythonコンソールでは「現在のプロセスを終了」ボタンをクリックします。または、私はSpyderを直接閉じます。ゾンビのプロセスは常にそこにあります。私もAtomを使いました。スクリプトを実行して後でAtomを閉じると、同じ状況になります。 – Yunguan
使用しているOSはどれですか? – noxdafox