Python からマルチプロセッシング ライブラリを使用してプロセスを作成すると、親プロセスは子が戻るのを待ってから戻ります。実際、ドキュメントでは、すべての子に参加することを推奨しています。しかし、子プロセスが終了する前に親を戻したいと思います。
子プロセスを「デタッチ」する方法はありますか。
subprocess.Popen を使用すると切り離された子プロセスを作成できることはわかっていますが、キューやロックなどのマルチプロセッシング ライブラリの機能を使用したいと考えています。
違いを示すために 2 つの例を作成しました。
最初の例では、マルチプロセッシング ライブラリを使用します。このスクリプトが呼び出されると、親メッセージが出力され、5 秒間待機し、子メッセージが出力されてから戻ります。
# Using multiprocessing, only returns after 5 seconds
from multiprocessing import Process
from time import sleep, asctime
def child():
sleep(5.0)
print 'Child end reached on', asctime()
if __name__ == '__main__':
p = Process(target = child)
p.start()
# Detach child process here so parent can return.
print 'Parent end reached on', asctime()
2 番目の例では、subprocess.Popen を使用しています。このスクリプトが呼び出されると、親メッセージを出力し、(!!!) を返し、5 秒後に子メッセージを出力します。
# Using Popen, returns immediately.
import sys
from subprocess import Popen
from time import sleep, asctime
def child():
sleep(5)
print 'Child end reached on', asctime()
if __name__ == '__main__':
if 'call_child' in sys.argv:
child()
else:
Popen([sys.executable] + [__file__] + ['call_child'])
print 'Parent end reached on', asctime()
キュー、パイプ、ロック、セマフォなどを渡すことができれば、2 番目の例は受け入れられます。
IMO、最初の例は、よりクリーンなコードにもつながります。
Windowsでpython 2.7を使用しています。