2017-01-11 114 views
0

寻求建立一个python脚本,从stdin运行一个无限循环,如for line in sys.stdin:。对于每次迭代,我想从后台使用line作为输入在池中获取一名工作人员。完成执行或超时的过程打印到标准输出。Python连续并行执行

我很难找到一个能够连续工作的工作池模块。例如,multiprocess pool module仅支持join等功能,等待所有员工完成所有任务。对于上述规范,我无法提前知道所有任务,并且需要为后台进程分配工作。

+0

您可以使用从队列中消耗从结果的独立进程工作人员(过程),将其打印到标准输出。 – bhdnx

+0

重申主意......每一行都被添加到队列中。然后每个进程连续检查队列中的一条线。 (我是否需要锁定队列,以便多个进程不会将同一行从队列中删除?)。那么如果有一行,进程会将其从队列中移除并将结果打印到stdout,然后返回查看队列?如果工作需要很长时间并继续前进,我该如何强制进程超时?你知道任何在线的例子吗? –

+0

你有你的主循环产卵过程(...,参数=(队列,线)),每条新线到达。与此同时,以前的spanwed Process消耗队列并打印结果。 https://docs.python.org/3.6/library/multiprocessing.html – bhdnx

回答

1

这将永远运行。

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) 
+0

嘿!我很确定这是行不通的。你试过了吗?我用1到10的循环尝试了这样的事情。apply_async实际上并没有开始执行任务。 –

+0

你可以在这里看到它的行动:http://pastebin.com/19mSxGha – noxdafox

0

使用Poolimap可能更容易,但你必须承担工人的最大容量(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)