Модуль многопроцессорности испортил замену глобальной переменной - PullRequest
0 голосов
/ 12 июля 2020

Итак, есть глобальная переменная с именем 'someVariable', но почему-то переменная не изменяется, даже если вызывается основная функция. Похоже, что каждый раз, когда вызывается мультипроцессор, он снова выполняет весь код и снова присваивает someVariable переменной fff. Как это предотвратить?

from multiprocessing import Process

print("someVariable set to fff")
someVariable = "fff"

def do_job():
    print("printing - " + someVariable)

def runTasks(totalProcesses):
    number_of_processes = int(totalProcesses)

    for w in range(number_of_processes):
        p = Process(target=do_job)
        p.start()

if __name__ == '__main__':
    someVariable = "lllllllllllllllllllll"
    runTasks(3)

1 Ответ

0 голосов
/ 12 июля 2020

Вам необходимо учесть пару вещей:

  • В __main__ вы назначили:

    someVariable = "lllllllllllllllllllll"
    

    Но это значение никогда не передается в do_job() во время печати. ​​

Решение

Для изменения переменной вы можете:

  • При объявлении передать желаемый текст.

    p = Process(target=do_job, args=('lllllllllllllllllllll',))
    
  • Вам необходимо вызвать join() также после start():

    p.start()
    p.join()
    
  • Ваша измененная программа будет:

    from multiprocessing import Process
    
    print("someVariable set to fff")
    someVariable = "fff"
    
    def do_job(string):
        print("printing - " + string)
    
    def runTasks(totalProcesses):
        number_of_processes = int(totalProcesses)
    
        for w in range(number_of_processes):
        p = Process(target=do_job, args=('lllllllllllllllllllll',))
        p.start()
        p.join()
    
    if __name__ == '__main__':
        runTasks(3)
    
  • Вывод в консоль:

    someVariable set to fff
    someVariable set to fff
    printing - lllllllllllllllllllll
    someVariable set to fff
    printing - lllllllllllllllllllll
    someVariable set to fff
    printing - lllllllllllllllllllll
    

Ссылка

многопроцессорность - параллелизм на основе процессов

...