Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 满足条件后的多处理和中断过程_Python_Python 3.x_Multiprocessing_Conditional Statements - Fatal编程技术网

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))):
    # ...