Дочерний процесс не наследует Python глобальную переменную на Windows - PullRequest
0 голосов
/ 28 февраля 2020

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

Простая демонстрация:

from multiprocessing import Process, Value
global foo
foo = Value('i',1)
def printfoo():
  global foo 
  with foo.get_lock():
    print(foo.value)
if __name__ == '__main__':
  with foo.get_lock():
    foo.value = 2
  Process(target=printfoo).start()

На Linux и MacOS отображается ожидаемое 2. На Windows отображается 1, даже если изменение глобального значения выполнено. до звонка на Process. Как я могу сделать изменения видимыми для дочернего процесса на Windows тоже?

1 Ответ

1 голос
/ 28 февраля 2020

Проблема в том, что ваш дочерний процесс создает новое общее значение, а не использует то, которое создал родительский. Ваш родительский процесс должен явно отправить Value дочернему элементу, например, в качестве аргумента целевой функции:

from multiprocessing import Process, Value

def use_shared_value(val):
    val.value = 2

if __name__ == '__main__':
    val = Value('i', 1)
    p = Process(target=use_shared_value, args=(val,))
    p.start()
    p.join()
    print(val.value)

(К сожалению, у меня нет Windows Python установить, чтобы проверить это.)


Дочерние процессы не могут наследовать глобальные переменные в Windows, независимо от того, инициализированы ли эти глобальные переменные в multiprocessing.Value экземплярах. multiprocessing.Value не меняет того факта, что дочерний процесс повторно выполняет ваш файл, а повторное выполнение конструкции Value не использует общие ресурсы, выделенные родителем.

...