簡體   English   中英

我確實希望每個多處理池工作者都有自己的全局變量副本並能夠修改它

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM