Пожалуйста, обратите внимание этот код:Shared государства в Python многопроцессорной Процессы
import time
from multiprocessing import Process
class Host(object):
def __init__(self):
self.id = None
def callback(self):
print "self.id = %s" % self.id
def bind(self, event_source):
event_source.callback = self.callback
class Event(object):
def __init__(self):
self.callback = None
def trigger(self):
self.callback()
h = Host()
h.id = "A"
e = Event()
h.bind(e)
e.trigger()
def delayed_trigger(f, delay):
time.sleep(delay)
f()
p = Process(target = delayed_trigger, args = (e.trigger, 3,))
p.start()
h.id = "B"
e.trigger()
Это дает на выходе
self.id = A
self.id = B
self.id = A
Однако, я ожидал, что это даст
self.id = A
self.id = B
self.id = B
..because h.id уже был изменен на «B» к моменту вызова метода триггера.
Кажется, что экземпляр экземпляра узла создается в момент запуска отдельного Процесса, поэтому изменения исходного узла не влияют на эту копию.
В моем проекте (более подробно, конечно) поля экземпляра хоста изменяются время от времени, и важно, чтобы события, вызванные кодом, запущенным в отдельном процессе, имели доступ к этим изменениям.
'def __init (self):'? Вам не хватает '__' в конце? – thefourtheye
Вы правы: многопроцессор запускает те потоки в отдельных потоках, и каждый поток имеет свой собственный экземпляр класса Host, и они не общаются друг с другом. Вы должны проверить этот ответ: http://stackoverflow.com/questions/16244745/how-to-use-classes-with-python-multiprocessing – theodox
многопроцессорность не делит память ... это фактически 2 полностью отдельных программы. используйте «multiprocessing.Pipe» для обмена данными между процессами или используйте потоки, если вам требуется разделяемая память (есть способ обмениваться памятью с многопроцессорными iirc ... но это делает все медленным ... невыносимо) –