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

时间:2019-07-11 13:18:19

标签: python python-3.x python-multiprocessing

我对多重处理模块不熟悉。我正试图验证不同过程中的变量是否相关。测试之后,我发现不同的进程可能会“共享”变量。当进程具有相同的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会增加?

1 个答案:

答案 0 :(得分:0)

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

此注释在multiprocessing.pool.Pool类中:

  

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