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

Python でノンブロッキングのサブプロセス実行を実現するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-19 13:47:02209ブラウズ

How to Achieve Non-Blocking Subprocess Execution in Python?

ノンブロッキング サブプロセス実行

ノンブロッキング サブプロセス実行を実現するには、subprocess.call の代わりに subprocess.Popen の使用を検討してください。 subprocess.call はコマンドの完了を待ってから戻りますが、subprocess.Popen はすぐにサブプロセスを開始してファイルのようなオブジェクトを返します。

<code class="python">import subprocess

subprocess.Popen(["python", "slave.py"] + sys.argv[1:])</code>

subprocess.Popen を使用すると、スレーブに引数を渡すことができます。 py を作成し、main.py から独立して実行できるようにします。これで、slave.py は main.py をブロックせずにタスクを実行できるようになります。

<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>

Python 3.5 以降では、コルーチンを使用して並列処理とノンブロッキングのサブプロセス実行を実現することもできます。

<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 サイトの他の関連記事を参照してください。

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