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

Susan Sarandon
リリース: 2024-10-19 13:45:29
オリジナル
484 人が閲覧しました

How to Execute Non-Blocking Subprocesses in Python?

ノンブロッキング サブプロセス呼び出し

subprocess.call を使用して外部スクリプトを実行する場合、メイン プログラムの停止を避けるためにノンブロッキング ワークフローを維持することが不可欠です。この記事では、この目的を達成するための包括的なソリューションを紹介します。

subprocess.Popen を使用したアプローチ

ノンブロッキング サブプロセスを実行する主な方法は、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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!