Многопроцессорная обработка Python: отправка данных в процесс - PullRequest
2 голосов
/ 23 апреля 2009

У меня есть подклассы Process, вот так:

class EdgeRenderer(Process):
    def __init__(self,starter,*args,**kwargs):
        Process.__init__(self,*args,**kwargs)
        self.starter=starter

Затем я определяю run метод, который использует self.starter.

Этот starter объект относится к классу State, который я определяю.

Это нормально, что я делаю это? Что происходит с объектом? Это сериализовано? Означает ли это, что я всегда должен убедиться, что объект State сериализуем? Получает ли новый процесс дубликат этого объекта?

1 Ответ

8 голосов
/ 23 апреля 2009

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

Как говорится, вот пример:

from multiprocessing import Process
import time

class Starter(object):
    def __init__(self):
        self.state = False

x = Starter()

class EdgeRenderer(Process):
    def __init__(self,starter,*args,**kwargs):
        Process.__init__(self,*args,**kwargs)
        self.starter=starter
    def run(self):
        self.starter.state = "HAM SANDWICH"
        time.sleep(1)
        print self.starter.state

a = EdgeRenderer(x)
a.start()
x.state = True
a.join()
print x.state

При запуске вы увидите:

HAM SANDWICH
True

Таким образом, изменения, которые делает родитель, не сообщаются после fork (), и изменения, которые делает родитель, имеют ту же проблему. Вы должны придерживаться ограничений вилки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...