我正在尝试使用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.map说It blocks until the result is ready.
我认为这意味着All functions will complete before we move to the next line of code
。
我误解了吗?使用游泳池是否要求您始终致电pool.close()
和pool.join()
以确保完成任务?
编辑:我在AWS上运行,如果这有任何明显的区别 - 同事告诉我,我应该提一下。
非常感谢!
答案 0 :(得分:1)
所有工作人员在map
返回之前运行其函数并返回任何值。那是真实的。但这并不意味着你会立即看到所有的字符串。
您有多个工作进程尝试写入同一文件/终端。要完成这项工作,您可能必须import sys
并在工作流程中的每个sys.stdout.flush()
之后调用print()
。