4

Pythonスクリプトを実行すると、スクリプトからEOF文字を読み取るため、プロセス/インタープリターは終了しますか? [つまり、それは出口信号ですか?]

これに続くのは、python 子プロセスが終了することをどのように/いつ認識するか、つまり、次のように run() メソッドをオーバーライドして子プロセスを開始するときです。

class Example(multiprocessing.Process):
    def __init__(self, task_queue, result_queue):
        multiprocessing.Process.__init__(self)
        self.task_queue = task_queue
        self.result_queue = result_queue

    def run(self):
        while True:
            next_task = self.task_queue.get()
            if next_task is None:
                print '%s: Exiting' % proc_name
                break
#more stuff...[assume there's some task_done stuff, etc]

if __name__ == '__main__':
    tasks = multiprocessing.JoinableQueue()
    results = multiprocessing.Queue()

    processes = [ Example(tasks, results)
                  for i in range(5) ]
    for i in processes:
        i.start()
#more stuff...like populating the queue, etc.

今、私が興味を持っているのは、run() メソッドの完了時に子プロセスが自動的に終了するかどうかです。また、実行中にメイン スレッドを強制終了すると、子プロセスはすぐに終了しますか? run() 呼び出しが親プロセスのステータスとは無関係に完了できる場合、それらは終了しますか?

4

1 に答える 1

2

はい。サブクラス化を避け、代わりに引数を使用するrun必要があると思いますが、各子プロセスはメソッドの完了後に自動的に終了します。Processtarget

Linuxでは、終了ステータスを読み取らないと、子プロセスがゾンビ状態のままになる可能性があることに注意してください。

>>> from multiprocessing import Process
>>> def target():
...     print("Something")
... 
>>> Process(target=target).start()
>>> Something

>>> 

この後のプロセスを見ると:

ここに画像の説明を入力してください

プロセスの終了ステータスを(でProcess.exitcode)読み取った場合、これは発生しません。

Processインスタンスはバックグラウンドで新しいプロセスを起動します。このサブプロセスがいつどのように終了するかはOSに依存します。すべてのOSは、プロセス間の通信手段を提供します。「親」プロセスを強制終了しても、通常、子プロセスは終了しません。

たとえば、これを行う:

>>> from multiprocessing import Process
>>> import time
>>> def target():
...     while True:
...             time.sleep(0.5)
... 
>>> L = [Process(target=target) for i in range(10)]
>>> for p in L: p.start()
... 

メインのPythonプロセスには10個の子があります。

ここに画像の説明を入力してください

ここで、そのプロセスを強制終了すると、次のようになります。

ここに画像の説明を入力してください 子プロセスが継承されinit、実行されている場所に注意してください。

しかし、私が言ったように、これはOS固有です。一部のOSでは、親プロセスを強制終了すると、すべての子プロセスが強制終了されます。

于 2013-01-20T11:20:30.590 に答える