当某些项目相互依赖时,如何运行异步进程列表?
Posted
技术标签:
【中文标题】当某些项目相互依赖时,如何运行异步进程列表?【英文标题】:How can I run a list of async processes when some items are dependent on each other? 【发布时间】:2012-08-04 09:33:06 【问题描述】:我有一个需要运行的动态生成进程(带参数的命令行库)的列表。
我知道其中一些是相互依赖的。我已经有一些包含此信息的对象。例如,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()?
【问题讨论】:
Twisted 的主要区别是在函数结束时为您提供一个简单的替代繁忙循环的方法。这将使您的程序在获得相同结果的同时显着减少 CPU 使用量。不过,您仍然需要实现在正确的时间运行正确进程的逻辑。 我想说看看模块multiprocessing.queues
。如果您的问题转移到消费者生产者en.wikipedia.org/wiki/Producer-consumer_problem。
【参考方案1】:
我会使用一个消息队列,其中一些进程发布消息,被调用的进程将订阅这些消息。
【讨论】:
以上是关于当某些项目相互依赖时,如何运行异步进程列表?的主要内容,如果未能解决你的问题,请参考以下文章