Python Multiprocess diff между Windows и Linux - PullRequest
6 голосов
/ 06 июля 2011

У меня есть скрипт с именем jobrunner.py, который вызывает методы класса в main.py.См. Ниже ...

# jobrunner.py
from multiprocessing import Process
import main
from main import BBOX

def _a(arg):
    f = main.a()
    print f.run()

def _b(arg):
    p = main.b()
    print p.run()

if __name__ == '__main__':
    world = '-180,180,-90,90'
    BBOX.append(world.split(','))

    p1 = Process(target=_a, args=("1",))
    p2 = Process(target=_b, args=("1",))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

Процессы _a и _b без проблем запускаются в OSX и Ubuntu, но когда я пытаюсь запустить одно и то же в Windows (та же версия python и все), произойдет сбой.этот индекс вне диапазона.Это наводит меня на мысль, что «глобальная» переменная BBOX не устанавливается и не передается между модулями на платформе Windows.Кто-нибудь еще видел что-то подобное и знает, как это исправить?

Адам

ОБНОВЛЕНИЕ: Я понял это, хотя это может быть полный взлом ...Смотрите ниже!

# jobrunner.py
from multiprocessing import Process
import main
from main import BBOX

def _a(arg):
    BBOX.append(arg) #This is the key
    f = main.a()
    print f.run()

def _b(arg):
    BBOX.append(arg) #This is the key
    p = main.b()
    print p.run()

if __name__ == '__main__':
    world = '-180,180,-90,90'
    BBOX.append(world.split(','))

    p1 = Process(target=_a, args=(BBOX[0],))
    p2 = Process(target=_b, args=(BBOX[0],))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

1 Ответ

17 голосов
/ 06 июля 2011

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

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

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

После того, как вы это сделаете, ваш код будет работать на обоих Unixи Windows.

...