寻求建立一个python脚本,从stdin运行一个无限循环,如for line in sys.stdin:
。对于每次迭代,我想从后台使用line
作为输入在池中获取一名工作人员。完成执行或超时的过程打印到标准输出。Python连续并行执行
我很难找到一个能够连续工作的工作池模块。例如,multiprocess pool module仅支持join
等功能,等待所有员工完成所有任务。对于上述规范,我无法提前知道所有任务,并且需要为后台进程分配工作。
寻求建立一个python脚本,从stdin运行一个无限循环,如for line in sys.stdin:
。对于每次迭代,我想从后台使用line
作为输入在池中获取一名工作人员。完成执行或超时的过程打印到标准输出。Python连续并行执行
我很难找到一个能够连续工作的工作池模块。例如,multiprocess pool module仅支持join
等功能,等待所有员工完成所有任务。对于上述规范,我无法提前知道所有任务,并且需要为后台进程分配工作。
这将永远运行。
import sys
from multiprocessing import Pool
pool = Pool()
for line in sys.stdin.readline():
pool.apply_async(function, args=[line])
def function(line):
"""Process the line in a separate process."""
print(line)
嘿!我很确定这是行不通的。你试过了吗?我用1到10的循环尝试了这样的事情。apply_async实际上并没有开始执行任务。 –
你可以在这里看到它的行动:http://pastebin.com/19mSxGha – noxdafox
使用Pool
和imap
可能更容易,但你必须承担工人的最大容量(processes=5
):
import multiprocessing
import sys
def worker(line):
return "Worker got %r" % (line)
pool = multiprocessing.Pool(processes=5)
for result in pool.imap(worker, sys.stdin):
print "Result: %r" % (result)
您可以使用从队列中消耗从结果的独立进程工作人员(过程),将其打印到标准输出。 – bhdnx
重申主意......每一行都被添加到队列中。然后每个进程连续检查队列中的一条线。 (我是否需要锁定队列,以便多个进程不会将同一行从队列中删除?)。那么如果有一行,进程会将其从队列中移除并将结果打印到stdout,然后返回查看队列?如果工作需要很长时间并继续前进,我该如何强制进程超时?你知道任何在线的例子吗? –
你有你的主循环产卵过程(...,参数=(队列,线)),每条新线到达。与此同时,以前的spanwed Process消耗队列并打印结果。 https://docs.python.org/3.6/library/multiprocessing.html – bhdnx