满足条件后的多处理和中断进程



我有一个算法,我将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))):
    # ...

相关内容

  • 没有找到相关文章

最新更新