ノンブロッキング subprocess.call: 並列スクリプト実行の実現
Python プログラムで asubprocess.call() を実行する場合、呼び出し元は通常、サブプロセスが完了するまで待ってから続行します。ただし、特定のアプリケーションでは、サブプロセスをノンブロッキングにして、サブプロセスが同時に実行されている間も呼び出し元が実行を継続できるようにすることが望ましい場合があります。
問題のシナリオ
次のシナリオを考えてみましょう。「main.py」プログラムから非ブロッキングsubprocess.call()として「slave.py」スクリプトを開始したいと考えています。 "main.py" の引数を "slave.py" に最初に起動するときに 1 回渡す必要がありますが、それ以降はスクリプト間で通信する必要はありません。
解決策: subprocess.Popen
「slave.py」のノンブロッキング実行を実現するには、「main.py」の「subprocess.call()」を「subprocess.Popen()」に置き換えます。サブプロセスを待つ代わりに完了するには、「subprocess.Popen()」がすぐに戻り、「main.py」が操作を続行できるようになります。
コード例
<code class="python">import subprocess import sys subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
代替: asyncio
Python の最新バージョン (3.5 以降) では、「asyncio」モジュールを利用してノンブロッキングのサブプロセス呼び出しを実装できます。このアプローチでは、コルーチンとの同時実行性を利用して複数のタスクを実行できます。
コード例 (asyncio)
<code class="python">import asyncio async def do_subprocess(): proc = await asyncio.create_subprocess_exec('sleep', '5') returncode = await proc.wait() print(f'Subprocess done sleeping. Return code = {returncode}') loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.gather(do_subprocess())) loop.close()</code>
補足
以上がPython で Subprocess.call のノンブロッキング実行を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。