[英]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.