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