Многопроцессорность Python:Отправка данных в процесс
-
13-09-2019 - |
Вопрос
у меня есть подклассы Process
вот так:
class EdgeRenderer(Process):
def __init__(self,starter,*args,**kwargs):
Process.__init__(self,*args,**kwargs)
self.starter=starter
Затем я определяю run
метод, который использует self.starter
.
Что starter
объект принадлежит классу State
что я определяю.
Это нормально, что я это делаю?Что происходит с объектом?Сериализируется ли он?Означает ли это, что я всегда должен обеспечивать State
объект сериализуем?Получает ли новый процесс дубликат этого объекта?
Решение
В системах 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(), а изменения, вносимые дочерним элементом, имеют ту же проблему.Вы должны соблюдать ограничения форка.