実行する必要がある動的に生成されたプロセス (引数付きのコマンド ライン ライブラリ) のリストがあります。
それらのいくつかは互いに依存していることを私は知っています。この情報を含むオブジェクトがいくつかあります。たとえば、standalone_exec_item には process_data.process_id とdependent_on_process_ids (プロセス ID のリスト) が含まれます。
現在、マルチプロセッシング ライブラリを使用して、次のようにプロセスのリストを非同期的に実行することを考えています。
from multiprocessing import Process
import subprocess
def execute_standalone_exec_items(standalone_exec_items):
standalones = []
def run_command(command):
output = subprocess.check_output(shlex.split(command))
return output
for standalone_exec_item in standalone_exec_items:
standalone_command = generate_command(standalone_exec_item.process_data)
standalone = Process(
target=run_command,
args=(standalone_command,)
)
standalones.append(standalone)
for standalone in standalones:
standalone.start()
while True:
flag = True
for standalone in standalones:
if standalone.is_alive():
flag = False
if flag:
break
ただし、依存プロセスを実行する前に非同期プロセスが実行されるのを待つより良い方法があるかどうかを知りたいです。コールバックを使用できますか? Twisted の deferred について聞いたことがありますが、これを使用できますか?
ベストプラクティスは何ですか?
編集: Popen がノンブロッキングであり、マルチプロセッシングを使用する必要がないのは正しいですか? または、fcntl() を使用する必要がありますか?