subprocess.call を使用して外部スクリプトを実行する場合、メイン プログラムの停止を避けるためにノンブロッキング ワークフローを維持することが不可欠です。この記事では、この目的を達成するための包括的なソリューションを紹介します。
ノンブロッキング サブプロセスを実行する主な方法は、subprocess.call の代わりに subprocess.Popen を使用することです。この代替方法ではメイン プログラムがブロックされず、サブプロセスが独立して実行されている間もメイン プログラムの操作を続行できます。以下に例を示します。
<code class="python">subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>
ノンブロッキング サブプロセス呼び出しの完全なデモンストレーションについては、次のコードを検討してください。
<code class="python">import subprocess import time p = subprocess.Popen(['sleep', '5']) while p.poll() is None: print('Still sleeping') time.sleep(1) print('Not sleeping any longer. Exited with returncode %d' % p.returncode)</code>
このコードは、 「sleep」コマンドを非同期的に実行し、完了するまでステータスを定期的にチェックします。
Python バージョン 3.5 以降の場合、より現代的で効率的なアプローチには、asyncio の使用が含まれます。これにより、真の同時実行が可能になり、複数のタスクを同時に実行できるようになります。以下に例を示します。
<code class="python">import asyncio async def do_subprocess(): print('Subprocess sleeping') proc = await asyncio.create_subprocess_exec('sleep', '5') returncode = await proc.wait() print('Subprocess done sleeping. Return code = %d' % returncode) async def sleep_report(number): for i in range(number + 1): print('Slept for %d seconds' % i) await asyncio.sleep(1) loop = asyncio.get_event_loop() tasks = [ asyncio.ensure_future(do_subprocess()), asyncio.ensure_future(sleep_report(5)), ] loop.run_until_complete(asyncio.gather(*tasks)) loop.close()</code>
このアプローチにより、サブプロセスとメイン プログラムの両方が同時に実行され、パフォーマンスと応答性が最大化されます。
以上がPython でノンブロッキングサブプロセスを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。