2017-01-11 28 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)