2015-05-15 4 views
1

Пожалуйста, обратите внимание этот код: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» к моменту вызова метода триггера.

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

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

+0

'def __init (self):'? Вам не хватает '__' в конце? – thefourtheye

+2

Вы правы: многопроцессор запускает те потоки в отдельных потоках, и каждый поток имеет свой собственный экземпляр класса Host, и они не общаются друг с другом. Вы должны проверить этот ответ: http://stackoverflow.com/questions/16244745/how-to-use-classes-with-python-multiprocessing – theodox

+1

многопроцессорность не делит память ... это фактически 2 полностью отдельных программы. используйте «multiprocessing.Pipe» для обмена данными между процессами или используйте потоки, если вам требуется разделяемая память (есть способ обмениваться памятью с многопроцессорными iirc ... но это делает все медленным ... невыносимо) –

ответ

3

multiprocessing пробегает материал в отдельности процессы. Почти немыслимо, что вещи не копируются при их отправке, так как обмен файлами между процессами требует разделяемой памяти или связи.

Фактически, если вы просматриваете модуль, вы можете увидеть объем усилий, необходимых для фактического обмена информацией между процессами после расхождения, либо через explicit communication, либо через explicitly-shared objects (которые имеют очень ограниченное подмножество язык и должен управляться Manager).

+0

Спасибо, мне удалось найти способ запуска этих источников событий в отдельных потоках, а не в процессах. Если бы я не мог этого сделать, возможно, я мог бы использовать Redis для получения данных. – Passiday

Смежные вопросы