Python 满足条件后的多处理和中断过程
我有一个算法,我把Python 满足条件后的多处理和中断过程,python,python-3.x,multiprocessing,conditional-statements,Python,Python 3.x,Multiprocessing,Conditional Statements,我有一个算法,我把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
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')]
,而不管子流程实际计算值的顺序如何。此外,由于它是映射而不是imap,因此在返回给您之前,它必须构建整个结果列表
要在结果到达时获得结果(作为生成器而不是列表,并按照完成的顺序),请使用:
Pool.map
将按您要求的顺序返回结果。因此,pool.map(foo,'abc')
将返回[foo('a')、foo('b')、foo('c')]
,而不管子流程实际计算值的顺序如何。此外,由于它是映射而不是imap,因此在返回给您之前,它必须构建整个结果列表
要在结果到达时获得结果(作为生成器而不是列表,并按照完成的顺序),请使用:
for x in pool.imap_unordered(foo, range(int(len(big)/2))):
# ...