尋求建立一個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