2017-05-18 4 views
0

最近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() 
+1

「カーネルをシャットダウンする」とはどういう意味ですか?どのコマンドを実際に発行しますか? – noxdafox

+0

実際、私はSpyder IDEを使用し、Ipythonコンソールでは「現在のコマンドを停止する」、Pythonコンソールでは「現在のプロセスを終了」ボタンをクリックします。または、私はSpyderを直接閉じます。ゾンビのプロセスは常にそこにあります。私もAtomを使いました。スクリプトを実行して後でAtomを閉じると、同じ状況になります。 – Yunguan

+0

使用しているOSはどれですか? – noxdafox

答えて

0

親がクリーンアップの可能性なしに突然終了されますので、子供のプロセスが解放されていません。したがって、daemonフラグは使用されません。

私は、おそらくそのような使用事例を考慮していないので、私はIDEを持つ子供とプロセスを終了しません。私はむしろOSの機能に頼っています。

Taskkillコマンドを/Tパラメータとともに使用することができます。 taskkill documentationを参照してください。

Linuxではpkillコマンドに-Pパラメータを使用できます。 Pkill manpage

最後の手段は、SIGTERM信号をインターセプトし、SIGINTとして再ルーティングすることです。しかし、私はこれをお勧めしません。

import os 
from signal import signal, SIGINT, SIGTERM 

def handler(*_): 
    os.kill(os.pid, SIGINT) 

signal.signal(SIGTERM, handler) 

これはハックですが、Windowsでも動作するかどうかはわかりません。

+0

ありがとうございました。だから、唯一の方法は、それらのゾンビを人工的にきれいにすることです?私はTaskkillを試して、それは非常にうまくいく:)今は、私は非常にSIGTERMのコードを理解することはできませんが、私は後でいくつかの検索を行います。再度、感謝します ! – Yunguan

+0

答えが役に立つ場合は、他の人が簡単に見つけることができるように、正しいとマークしてください。あなたのIDEがカスタム化を許可している場合(Atomは)、ショートカットを追加することができます。あなたがSIGTERMの選択肢を完全に理解していないなら、それから離れてください:)。とにかくハックです。 – noxdafox

+0

OK!ありがとうございました! :)遅れて申し訳ありません。 – Yunguan

関連する問題