我有一个算法,我将big
列表分成写在字典中的两个元素片段,然后在函数中doit
我检查数字3
是否在给定元素中排在第一位,如果是这样,我返回整个元素,如果没有,我返回None
。然后我想在这些部门中输入多处理,只返回找到最快的一个。我有这个代码:
import multiprocessing as mul
big = [[0,1],[3,0],[1,5],[0,3],[3,1],[0,6],[0,1],[3,2],[1,5],[0,3],[3,3],[0,6],[0,1],[3,4],[1,5],[0,3],[3,5],[0,6],[0,1],[3,6],[1,5],[0,3],[3,7],[0,6],[0,1],[3,8],[1,5],[0,3],[3,9],[0,6],[0,1],[3,10],[1,5],[0,3],[3,11],[0,6]]
sources={}
for x in range(int(len(big)/2)):
sources["d{0}".format(x)] = big[2*x:2*x+2]
def doit(L):
for i in L:
if i[0]==3:
return i
return None
def foo(j):
return doit(sources["d{0}".format(j)])
if __name__ == '__main__':
pool = mul.Pool(4)
for x in pool.map(foo, range(int(len(big)/2))):
print (x)
if x == None:
break
pool.close()
pool.join()
但是我做错了什么,因为我没有注意到结果中过程的并行性,因为我一直收到:
[3, 0]
None
我预计它并不总是一对[3,0]
.
如何改变它?
Pool.map
将按照您要求的顺序返回结果。因此,无论子进程实际计算值的顺序如何,pool.map(foo, 'abc')
都将返回[foo('a'), foo('b'), foo('c')]
。此外,由于它的map而不是imap,它必须在返回给您之前建立整个结果列表。
要在结果到达时获得结果(作为生成器而不是列表并按它们完成的顺序(,请使用 Pool. imap_unordered
:
for x in pool.imap_unordered(foo, range(int(len(big)/2))):
# ...