Я хочу, чтобы у каждого работника многопроцессорного пула была своя собственная копия глобальной переменной и возможность ее изменять - PullRequest
0 голосов
/ 02 мая 2020

Я хочу, чтобы каждый процесс имел свою собственную копию глобальной переменной, и процесс должен иметь возможность изменять и хранить глобальную переменную:

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    

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Так что с 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 в моей функции, потому что после завершения процесса он не может перезапустить тот же процесс.

0 голосов
/ 02 мая 2020

Если мы печатаем идентификатор процесса, мы видим, что у каждого работника есть свои собственные переменные:

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)

Я распределю пул до того, как l oop.

...