python - 使用 Python 的 multiprocessing.pool.map 操作同一个整数

标签 python asynchronous multiprocessing shared-memory shared-state

问题

我正在使用 Python 的多处理模块异步执行函数。我想要做的是能够在每个进程调用和执行 def add_print 时跟踪我的脚本的总体进度。例如,我希望下面的代码将 1 添加到 total 并在每次进程运行时打印出值 (1 2 3 ... 18 19 20)功能。我的第一次尝试是使用全局变量,但这没有用。由于该函数是异步调用的,因此每个进程读取 total 作为 0 开始,并独立于其他进程加 1。所以输出是 20 1 而不是递增值。

即使函数正在异步运行,我如何才能以同步方式从我的映射函数引用同一内存块?我的一个想法是以某种方式将 total 缓存在内存中,然后在我添加到 total 时引用该确切的内存块。这在 Python 中是一种可能的且从根本上来说是合理的方法吗?

如果您需要更多信息或者我解释得不够好,请告诉我。

谢谢!


代码

#!/usr/bin/python

## Import builtins
from multiprocessing import Pool 

total = 0

def add_print(num):
    global total
    total += 1
    print total


if __name__ == "__main__":
    nums = range(20)

    pool = Pool(processes=20)
    pool.map(add_print, nums)

最佳答案

你可以使用 shared Value :

import multiprocessing as mp

def add_print(num):
    """
    https://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing
    """
    with lock:
        total.value += 1
    print(total.value)

def setup(t, l):
    global total, lock
    total = t
    lock = l

if __name__ == "__main__":
    total = mp.Value('i', 0)
    lock = mp.Lock()
    nums = range(20)
    pool = mp.Pool(initializer=setup, initargs=[total, lock])
    pool.map(add_print, nums)

池初始化程序为每个工作子进程调用一次setup设置 使 total 成为工作进程中的全局变量,因此 total 可以是 当工作人员调用 add_print 时在 add_print 内部访问。

请注意,进程数不应超过您机器的 CPU 数。如果这样做,多余的子进程将等待 CPU 可用。所以不要使用 processes=20 除非你有 20 个或更多的 CPU。如果您不提供 processes 参数,multiprocessing 将检测可用的 CPU 数量并为您生成一个包含那么多 worker 的池。任务的数量(例如 nums 的长度)通常大大超过 CPU 的数量。没关系;当工作人员可用时,任务由其中一名工作人员排队和处理。

关于python - 使用 Python 的 multiprocessing.pool.map 操作同一个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31778021/

相关文章:

python - 无法使用 pipelinenv 安装 PyPi 库

用于 GPIO Led blink 的 Python 线程类

c# - 哪种线程方法最适合主服务器网络?

python : sharing a lock between spawned processes

php - Firebase JWT 库无法验证 Python JWT token

python - 在 python 脚本中使用 slurm 创建作业,迭代列表中的项目

python - 需要帮助并行化 python 中的循环

c++ - Visual Studio 中的 "multi-processor compilation"有什么缺点吗?

python - PIL 图像到 QPixmap 的转换问题

java - 在 JAX-RS api 中实现线程池