Python передает словарь для обработки в многопроцессорной - PullRequest
3 голосов
/ 09 сентября 2011

У меня есть класс, который содержит (большое) количество различных свойств, включая несколько словарей. Когда я передаю экземпляр класса новому процессу, кажется, что все числовые значения передаются правильно, но все словари, которые были в объекте класса, очищаются.

Вот простой тест, который я приготовил, который демонстрирует мою проблему:

from multiprocessing import Process

class State:
    a = 0
    b = {}

def f(s, i):
    print "f:", s.a, s.b

def main():

    state = State()

    state.a = 11
    state.b['testing'] = 12

    print "Main:", state.a, state.b

    ps = []
    for i in range(1):
        p = Process(target=f, args=(state, i))
        p.start()           # Do the work
        ps.append(p)
    for p in ps:
        p.join()

if __name__ == '__main__':
    main()

Я ожидаю, что результат будет

Main: 11 {'testing': 12}
f: 11 {'testing': 12}

но вместо этого я получаю

Main: 11 {'testing': 12}
f: 11 {}

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

проблема четко описана в документации для многопроцессорного модуля: в Windows отсутствует системный вызов fork(), поэтому в Windows исходный код модуля переоценивается в начале каждого процесса, поэтому текущее состояние не сохраняется.(в системе на базе * * x, включая OSX, Process реализован с использованием форка, и состояние сохраняется)

обратите внимание, что я говорю о состоянии всего модуля Python.

ваш способ удержания состояния неправильный: члены a и b класса State являются "статическими" членами всего класса, они не являются частью экземпляра State объект.выполняя state.a = 11, вы изменяете класс State, а не экземпляр класса.

ваш код работал бы нормально, если бы a и b были членами экземпляра State class:

class State(object):
    def __init__(self)
        self.a = 0
        self.b = {}

затем, передав экземпляр state новому процессу, правильно передаст значение, как и ожидалось.

0 голосов
/ 23 сентября 2011

Я решил обойти эту проблему, передав словари явно в дополнение к состоянию.например,

p = Process(target=f, args=(state, i, state.b))

...