[英]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)
我現在的 output 是
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
...
正如我預期的 output 是
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
如果我們打印 process 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()
我不得不移動我的 function 中的 True 代碼,因為一旦進程終止,它就無法重新啟動同一個進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.