如何使用多语言处理带有break语句的Python for循环?

时间:2016-03-18 04:47:47

标签: python parallel-processing multiprocessing

如何并行化具有if条件的for循环。如果满足该条件,则无需继续循环。如果我能为此使用多处理,那就太好了。

for i in xrange(N):
    x = do_something_with()
    if x == 0:
        break

上述代码可以在Python中并行化吗?

1 个答案:

答案 0 :(得分:1)

您可以在作业处于活动状态时终止multiprocessing.Pool,并且会终止子进程。如果您可以提前生成参数,则可以使用imap_unordered来提取结果并在满足条件时终止池。处理池中其他作业的子进程被终止,因此它们不会返回其他结果。

import multiprocessing as mp
import time

def worker(x):
    print('work item', x)
    time.sleep(x)
    result = x - 5
    if result == 0:
        print('termination condition')
    print('work item', x, 'done')
    return result

if __name__ == '__main__':
    p = mp.Pool(4)
    for result in p.imap_unordered(worker, range(20), chunksize=1):
        if result == 0:
            print('terminating')
            p.terminate()
            break
    print('done')

结果

work item 0
work item 1
work item 0 done
work item 4
work item 3
work item 2
work item 1 done
work item 5
work item 2 done
work item 6
work item 3 done
work item 7
work item 4 done
work item 8
termination condition
work item 5 done
work item 9
terminating
done

请注意,某些工作已经启动但尚未完成。