Python многопроцессорное поведение на MacOS и Windows - PullRequest
0 голосов
/ 16 марта 2020

Я создаю программу, которая работает на Windows P C, и у меня возникли некоторые проблемы с многопроцессорным модулем.

Допустим, мы запустили следующий код:

import multiprocessing as mp

def f():
    print('f running')


def main():
    p = mp.Process(target=f)
    p.start()

print('test print')

if __name__ == '__main__':
    main()

Если я запускаю его на MacOS, я получаю ожидаемый результат:

test print
f running

Если я его полощу на Windows, я получаю:

test print
test print
f running

Я понимаю, что это Это происходит потому, что python импортирует весь файл для каждого нового процесса, но есть ли способ заставить его вести себя как в MacOS?

Спасибо!

РЕДАКТИРОВАТЬ:

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

Создание этих глобальных переменных внутри if name == ... работает на MacOS, но не на Windows. А на MacOS мне бы не пришлось это делать в любом случае.

import multiprocessing as mp

def f():
    print(v)
    print('f running')


def main():
    p = mp.Process(target=f)
    p.start()

print('test print')

if __name__ == '__main__':
    v = 'a variable'
    main()

Вывод на MacOS:

test print
a variable
f running

Вывод на Windows:

test print
test print
Process Process-1:
Traceback (most recent call last):
  File "C:\Users\ixg21219\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 313, in _bootstrap
    self.run()
  File "C:\Users\ixg21219\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\ixg21219\Desktop\MP_test\test.py", line 4, in f
    print(v)
NameError: name 'v' is not defined

1 Ответ

0 голосов
/ 16 марта 2020

Как насчет:

if __name__ == '__main__':
    print('test print')
    main()
...