3

このようないくつかの質問を見てきましたが、子が生きているかどうかを確認し、子プロセスを終了するさまざまなバリエーションを試した後、問題を単純化しましたが、それでも機能しません。

sys.exit(0)でフォークされたプロセスを終了するのは間違っていますか?それを殺す別の方法はありますか?問題は、プロセスがいつ機能するかわからないため、親にプロセスを強制終了させることはできないということです。

最初は、終了する前にシステムコマンドを実行したためだと思いました(Pythonでシステムコマンドを実行してから終了します...終了しません)が、与えられたソリューションも機能しなかったため、簡略化されたバージョンではそれを削除しました。

次に例を示します。

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)
for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid

これは印刷します:

Child 27636 spawned
Child 27637 spawned
Child 27638 spawned
Child 27636 is alive
Child 27637 is alive
Child 27638 is alive

しかし、子プロセスは死んでいるはずです。

この場合、これらのプロセスがゾンビになる原因は何ですか?

4

2 に答える 2

5

あなたはwait()子プロセスのためにしなければなりません。

修正するには、次の行を追加してください。

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)

# ADD NEXT TWO LINES:
for pid in children:
    os.waitpid(pid, 0)

for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid

wait()は子供のためでなければなりません。詳しくはこちらをご覧man 2 waitください。

Pythonでは、モジュールを使用してこれらを処理できsubprocessます。

于 2012-04-13T10:26:42.383 に答える
2

子がPIDテーブルから消えるにはwait()、親側が必要です。

n_still_children_alive = len(children)
while n_still_children_alive > 0:
    pid, status = os.wait()
    print "Child %d died and joined" % pid
    n_still_children_alive -= 1

Pythonでマルチプロセッシングを試してみたい場合は、 moduleを使用するよりもmultiprocessingmoduleを使用する方がはるかに優れていosます。

于 2012-04-13T10:30:52.587 に答える