我想出了以下模式(顯示使用2名工人& 6個就業機會,而不是4 & 100):
import random
import time
from multiprocessing import Pool, TimeoutError
from queue import Queue
def worker(x):
print("Start: {}".format(x))
time.sleep(5 * random.random()) # Sleep a random amount of time
if x == 2:
raise Exception("Two is bad")
return x
if __name__ == '__main__':
with Pool(processes=2) as pool:
jobs = Queue()
for i in range(6):
jobs.put(pool.apply_async(worker, [i]))
while not jobs.empty():
j = jobs.get(timeout=1)
try:
r = j.get(timeout=0.1)
print("Done: {}".format(r))
except TimeoutError as e:
jobs.put(j) # Not ready, try again later
except Exception as e:
print("Exception: {}".format(e))
似乎工作得很好:
Start: 0
Start: 1
Start: 2
Done: 1
Start: 3
Exception: Two is bad
Start: 4
Start: 5
Done: 3
Done: 4
Done: 5
Done: 0
我會看看我是否可以製作一個通用的工具來管理我的排隊。
我認爲它的主要缺點是完成的工作可能會被忽略一段時間,而未完成的工作被輪詢並可能超時。避免這可能需要使用回調 - 如果它成爲一個足夠大的問題,我可能會添加到我的應用程序。
http://pyvideo.org/search.html?q=multiprocessing – wwii
@wwii是否有一些視頻特別推薦您解決這個問題? –
只有一般 - 我覺得Pycon的視頻講述的內容非常豐富。另外,[multiprocessing module documentation](https://docs.python.org/3/library/multiprocessing.html)中給出的示例似乎足以讓我在開始玩遊戲時進行實驗。 – wwii