繁体   English   中英

在多处理模块中使用Pool修改全局变量

[英]Modify global variable with Pool in multiprocessing module

我对多处理模块不熟悉。 我正试图验证不同过程中的变量是否相关。 测试之后,我发现不同的进程可能会“共享”变量。 当进程具有相同的pid时会发生这种情况。 我不确定是否有关系?

环境:Windows 10; python 3.7

# -*- coding: utf-8 -*-

import os
from multiprocessing import Pool

p=0

def Child_process(id_number):
    global p
    print('Task start: %s(%s)' % (id_number, os.getpid()))
    print('p = %d' % p)
    p=p+1
    print('Task {} end'.format(id_number))


if __name__ == '__main__':
    p = Pool(4)
    p.map(Child_process,range(5))
    p.close()
    p.join()

结果是:任务开始:0(7668)
p = 0
任务开始:1(10384)
任务0结束
p = 0
任务开始:2(7668)
p = 1
任务1结束
任务2结束
任务开始:3(7668)
任务开始:4(10384)
p = 1
任务4结束
p = 2
任务3结束

我认为p应该始终为0,但是当不同进程具有相同的pid时,p会增加?

根据定义,线程/进程池将重用相同的线程/进程。 这样,您就可以在线程/进程启动时设置资源,这样每个线程/进程就不必每次都初始化它们。 这包括全局变量,打开的文件,套接字等。您可以通过将initializer函数传递给线程/进程来进行一次initializer 因此,如果设置或增加变量p ,它将在过程的各个运行过程中保持设置状态。 如果您希望每次运行变量始终从0开始,则需要在每次运行开始时将其设置为0。

此注释位于multiprocessing.pool.Pool类中:

注意:池中的工作进程通常在池工作队列的整个期间内都处于活动状态。 在其他系统(例如Apache,mod_wsgi等)中发现的释放工人资源的常见模式是允许池中的工人在退出,清理和产生新进程之前仅完成一定数量的工作。取代旧的。 池的maxtasksperchild参数向最终用户公开了此功能。

暂无
暂无

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

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