我想出了以下模式(显示使用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