ホームページ  >  記事  >  バックエンド開発  >  Python で Subprocess.call のノンブロッキング実行を実現するにはどうすればよいですか?

Python で Subprocess.call のノンブロッキング実行を実現するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-19 13:53:02777ブラウズ

How to Achieve Non-Blocking Execution of Subprocess.call in Python?

ノンブロッキング 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>

補足

  • 「shell=」を使用する場合True。セキュリティ上の脆弱性が発生する可能性があるため、引数を渡すリストの使用は避けてください。
  • 提供された MCVE (Minimal Complete Verifiable Example) は、「subprocess.Popen( )」と「asyncio」を使用して、実践的な環境でコンセプトを紹介します。

以上がPython で Subprocess.call のノンブロッキング実行を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。