我确实希望每个多处理池工作人员都有自己的全局变量副本并能够修改它

I do want each multiprocessing pool worker to have its own copy of the global variable and be able to modify it

我希望每个进程都有自己的全局变量副本,并且进程应该能够修改和存储全局变量:

import multiprocessing
from multiprocessing import Pool
import time
input = [1,10]
first = 0
def printer (input) :
    global first
    first += input
    print('input', input)
    print('for input',input ,'first' , first)

def pool_handler():
    p = Pool(2)
    p.map(printer, input)


if __name__ == '__main__':
    while True:
        pool_handler()
        time.sleep(5)

我当前的输出是

input 1
for input 1 first 1
input 10
for input 10 first 10 
input 1
for input 1 first 1
input 10
for input 10 first 10
...

我的预期输出是

input 1
for input 1 first 1
input 10
for input 10 first 10
input 1
for input 1 first 2
input 10
for input 10 first 20    

如果我们打印进程 id,我们可以看到每个 worker 都有自己的变量:

import multiprocessing
from multiprocessing import Pool
import os
import time
input = [1,10]
first = 0
def printer (input) :
    global first
    first += input
    print(f'Process {os.getpid()} for input={input} first={first}')

def pool_handler(p):
    p.map(printer, input)

if __name__ == '__main__':
    p = Pool(2)
    while True:
        pool_handler(p)
        time.sleep(5)

我将池分配放在 while 循环之前。

因此 multiprocessing.pool 无法创建不同的进程,其中每个进程都有自己的全局变量副本。因为当创建池时,所有任务都会排队,并且任务会分配给空闲的池。

所以对于我的问题,我现在使用 multiprocessing.process,我创建了两个进程,现在每个进程都有自己的全局变量副本,每个进程都可以存储和修改全局变量。下面我发布了我当前的代码。

import multiprocessing
from multiprocessing import Pool,process,Process
import os
import time
#input = [1,10]
first = 0
def printer (input) :
    while True :
        global first
        first += input
        print(f'Process {os.getpid()} for input={input} first={first}')
        time.sleep(2)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=printer, args=(1,))
    p2 = multiprocessing.Process(target=printer, args=(10,))
        p1.start()
        p2.start()

我不得不在我的函数中移动 True 代码,因为一旦进程终止,它就无法重新启动同一进程。