C статические переменные в многопроцессорном Python
Здесь у меня есть функция, написанная на C++, вызывающая foo и делающая ее вызываемой (foo_wrapper) из python с помощью обертки python, написанной на C (wrapper.c).
В wrapper.c у меня есть статическая глобальная переменная "x", которая используется и обновляется foo.
Теперь все работает нормально, когда я вызываю foo из python в рамках одного процесса.
Однако, хотя я использую многопроцессорный модуль в Python, даже foo вызывается из основного процесса, это значение "x" НЕ, как должно быть!! Процедура вызова выглядит так:
P=Process(target=myf, args=(a,))
P.start()
foo_wrapper()
P.join()
мой вопрос: когда вызывается fork(), т.е. запускается несколько процессов, как python обрабатывает стек или кучу родительского / дочернего процесса? Как я могу сделать значение "х" прав на основной процесс (или родительский процесс)?
1 ответ
Глобальные переменные C++ являются глобальными только для одного процесса. Если вы используете multiprocessing
модуль, то по определению у вас будет несколько процессов, каждый со своим собственным представлением глобальной переменной. Python не делает ничего особенного, чтобы повлиять на это поведение.
Предполагая, что у вас есть контроль над кодом C++, я бы предложил реорганизовать его, чтобы сделать это глобальное состояние видимым для Python в форме, которую Python может сериализовать и десериализовать. Затем вы можете передать состояние между процессами, где это необходимо (например, используя один из классов очереди из multiprocessing
).