Многопроцессорность Python:Отправка данных в процесс

StackOverflow https://stackoverflow.com/questions/779384

  •  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(), а изменения, вносимые дочерним элементом, имеют ту же проблему.Вы должны соблюдать ограничения форка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top