python多处理pool.map没有阻塞?

时间:2017-02-08 15:46:15

标签: python python-multiprocessing

我正在尝试使用multiprocessing在python中并行化一些Web请求,但有时我发送给map的所有函数都无法完成。

无论我使用的是python 2还是3,都会显示这些结果。

测试脚本:

#!/usr/bin/env python

import multiprocessing

def my_print(string):
    print(string)

all_strings = ["alpaca", "bear", "cat", "dog", "elephant", "frog"]

pool = multiprocessing.Pool()
pool.map(my_print, all_strings)

我这样运行:

for i in `seq 1 50`; do ./test.py | wc -l; done | sort | uniq -c

我的结果如下:

6 5
44 6

...所以大部分时间函数的所有6次执行都在运行,但偶尔只有5次执行,直到整个脚本完成执行。我希望结果会有50 6(也就是说,每次运行都会执行所有函数)。

文档https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.mapIt blocks until the result is ready.我认为这意味着All functions will complete before we move to the next line of code

我误解了吗?使用游泳池是否要求您始终致电pool.close()pool.join()以确保完成任务?

编辑:我在AWS上运行,如果这有任何明显的区别 - 同事告诉我,我应该提一下。

非常感谢!

1 个答案:

答案 0 :(得分:1)

所有工作人员在map返回之前运行其函数并返回任何值。那是真实的。但这并不意味着你会立即看到所有的字符串。

您有多个工作进程尝试写入同一文件/终端。要完成这项工作,您可能必须import sys并在工作流程中的每个sys.stdout.flush()之后调用print()