2014-08-29 3 views
0
from multiprocessing import Process, Pipe 

def f(a1): 
    print a1.name 
    a1.conn2.send('why!?!?!?!?!!?!??') 
    a1.conn2.close() 

class test1: 
    name = 'this is name in class' 
    conn1,conn2 = Pipe() 

if __name__ == '__main__': 
    a1 = test1 

    p = Process(target=f, args=(a1,)) 
    p.start() 
    print a1.conn1.recv() 
    p.join() 

Я должен дать несколько аргументов дочернему процессу и связи между каналами между родителем и дочерним элементом.Как передать класс дочернему процессу в python?

Поэтому я стараюсь, чтобы класс к дочернему процессу включал трубу.

Но дочерний процесс этого кода ничего не может отправить.

Так родительский процесс висит на RECV() .....

Как можно решить эту проблему? помогите мне плз ..... TT

PS: Это питон 2,7

ответ

0

Предполагая, что вы используете Windows:

Вы инициализацией трубы статически внутри класса test1, поэтому, когда новый процесс (когда вы вызываете start()), воссоздается класс test1, а вместе с ним и труба. Это означает, что ваша функция, запущенная в новом процессе, использует другую трубу.

Это может быть решен путем создания трубы в например из test1 (или пропускания соединения непосредственно):

from multiprocessing import Process, Pipe 

def f(a1): 
    print a1.name 
    a1.conn2.send('why!?!?!?!?!!?!??') 
    a1.conn2.close() 

class Test1(object): 

    def __init__(self): 
     self.name = 'this is name in class' 
     self.conn1, self.conn2 = Pipe() 

if __name__ == '__main__': 
    a1 = Test1() 

    p = Process(target=f, args=(a1,)) 
    p.start() 
    print a1.conn1.recv() 
    p.join() 
+0

Вы гений !!! Большое спасибо! –