【问题标题】:python multiprocessing pool.map not blocking?python multiprocessing pool.map 不阻塞?
【发布时间】:2017-02-08 15:46:14
【问题描述】:

我正在尝试使用 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 上运行,如果这有任何明显的不同 - 一位同事告诉我我应该提到这一点。

提前非常感谢!

【问题讨论】:

    标签: python python-multiprocessing


    【解决方案1】:

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

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

    【讨论】:

    • 我明白了。所以确实意味着脚本末尾的pool.close(); pool.join()(这使得它每次都完全运行所有内容)等待所有子进程完成,这意味着一个标准输出flush()
    猜你喜欢
    • 2013-08-21
    • 2021-11-02
    • 2023-02-23
    • 1970-01-01
    • 2014-05-25
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多