Python で Bash サブプロセスの並列実行を実現する方法: スレッドと他のオプション?

DDD
リリース: 2024-10-25 16:36:15
オリジナル
299 人が閲覧しました

How to Achieve Parallel Execution of Bash Subprocesses in Python: Threads vs. Other Options?

Python のマルチスレッド Bash サブプロセス

スレッドはタスクの並列化に不可欠ですが、サブプロセス モジュールと一緒にスレッドを使用するのは難しい場合があります。スレッドを介して bash プロセスを実行する場合、それらは順次に実行される傾向があります。

スレッドを使用しない並列実行

サブプロセスを並列実行するためにスレッドを使用する必要はありません。 subprocess モジュールの Popen 関数は、これを直接処理できます。

<code class="python">from subprocess import Popen

commands = ['bash commands here']
processes = [Popen(cmd, shell=True) for cmd in commands]

# Perform other tasks while processes run in parallel
for p in processes:
    p.wait()</code>
ログイン後にコピー

同時サブプロセスの制限

同時プロセスの数を制限するには、multiprocessing.dummy.Pool の使用を検討してください。これは multiprocessing.Pool を模倣しますが、スレッドを利用します:

<code class="python">from functools import partial
from multiprocessing.dummy import Pool
from subprocess import call

commands = ['bash commands here']
pool = Pool(2) # Limit to 2 concurrent processes
for _, returncode in enumerate(pool.imap(partial(call, shell=True), commands)):
    if returncode != 0:
        print(f"Command failed: {returncode}")</code>
ログイン後にコピー

スレッドベースの代替手段

プロセス プールを使用せずに同時プロセスを制限する他のオプションには、スレッド キューの組み合わせが含まれますまたは次のアプローチ:

<code class="python">from subprocess import Popen
from itertools import islice

commands = ['bash commands here']
running_processes = []

for cmd in islice(commands, 2):
    running_processes.append(Popen(cmd, shell=True))

while running_processes:
    for i, process in enumerate(running_processes):
        if process.poll() is not None:
            running_processes[i] = next(islice(commands, 1), None)</code>
ログイン後にコピー

Unix 固有のソリューション

Unix ベースのシステムの場合は、上記のアプローチと組み合わせて os.waitpid() を使用することを検討してください。ビジーなループを回避します。これが Python のマルチスレッド bash サブプロセスで利用できるさまざまなオプションをカバーし、発生するシーケンシャル実行の問題に対処することを願っています。さらにご質問がございましたら、お気軽にお問い合わせください!

以上がPython で Bash サブプロセスの並列実行を実現する方法: スレッドと他のオプション?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート