我对多重处理模块不熟悉。我正试图验证不同过程中的变量是否相关。测试之后,我发现不同的进程可能会“共享”变量。当进程具有相同的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会增加?
答案 0 :(得分:0)
根据定义,线程/进程池将重用相同的线程/进程。这样,您就可以在线程/进程启动时设置资源,这样每个线程/进程就不必每次都初始化它们。这包括全局变量,打开的文件,套接字等。您可以通过将initializer
函数传递给线程/进程来进行一次初始化。因此,如果您设置或递增变量p
,则它将在该过程的各个运行过程中保持不变。如果您希望每次运行变量始终从0开始,则需要在每次运行开始时将其设置为0。
此注释在multiprocessing.pool.Pool类中:
注意:池中的工作进程通常在池工作队列的整个期间内都处于活动状态。在其他系统(例如Apache,mod_wsgi等)中发现的释放工人资源的常见模式是允许池中的工人在退出,清理和产生新进程之前仅完成一定数量的工作。取代旧的。池的maxtasksperchild参数向最终用户公开了此功能。