繁体   English   中英

使用Python的multiprocessing.pool.map来操作相同的整数

[英]Using Python's multiprocessing.pool.map to manipulate the same integer

问题

我正在使用Python的多处理模块异步执行函数。 我想要做的是能够在每个进程调用并执行def add_print跟踪脚本的整体进度。 例如,我希望下面的代码total加1,并在每次进程运行该函数时打印出值( 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)

您可以使用共享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 setup使得total工作进程中一个全局变量,所以total可以在里面进行访问add_print当工人要求add_print

请注意,进程数不应超过计算机所具有的CPU数。 如果这样做,多余的子进程将等待CPU变为可用。 因此,除非您有20个或更多CPU,否则不要使用processes=20 如果您不提供processes参数,则multiprocessing将检测可用的CPU数量,并为您生成具有该多个工作​​程序的池。 任务数量(例如, nums的长度)通常大大超过CPU的数量。 没关系; 当工作人员可用时,任务由一个工作人员排队和处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM