Как изменить глобальные переменные при использовании параллельного программирования - PullRequest
0 голосов
/ 31 мая 2018

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

Но в конце выполнения кода результат, полученный из mp.Queue, верен, нопеременные не изменены.

вот простая версия кода:

import multiprocessing as mp

a = 3
b = 5

# define a example function
def f(length, output):
    global a
    global b
    if length==5:
       a = length + a
       output.put(a)
    if length==3:
       b = length + b
       output.put(b)


if __name__ == '__main__':

     # Define an output queue
     output = mp.Queue()    

     # Setup a list of processes that we want to run
     processes = []
     processes.append(mp.Process(target=f, args=(5, output)))
     processes.append(mp.Process(target=f, args=(3, output)))

     # Run processes
     for p in processes:
         p.start()

     # Exit the completed processes
     for p in processes:
         p.join()

     # Get process results from the output queue
     results = [output.get() for p in processes]

     print(results)
     print ("a:",a)
     print ("b:",b)

И удар - это ответы:

[8, 8]
a: 3
b: 5

Как я могу применить результаты процессов к глобальномупеременные?или как я могу запустить этот код с многопроцессорной обработкой и получить ответ, как запуск простого кода угрозы?

1 Ответ

0 голосов
/ 31 мая 2018

Когда вы используете Threading , два (или более) потока создаются в одном и том же процессе и совместно используют их память (глобальные значения).

Когда вы используете MultiProcessing , создается совершенно новый процесс , и каждый получает собственную копию памяти (глобальные).

Вы можете посмотреть mutiprocessing Value/Array или Manager, чтобы разрешить псевдоглобальные переменные, т.е. общие объекты.

...