2009-09-18 12 views
11

को देखते हुए this bug (Python Issue 4892) कि निम्न त्रुटि को जन्म देता है:अजगर 2.6 भेजने कनेक्शन वस्तु पर कतार/पाइप/आदि

>>> import multiprocessing 
>>> multiprocessing.allow_connection_pickling() 
>>> q = multiprocessing.Queue() 
>>> p = multiprocessing.Pipe() 
>>> q.put(p) 
>>> q.get() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File  "/.../python2.6/multiprocessing/queues.py", line 91, in get 
    res = self._recv() 
TypeError: Required argument 'handle' (pos 1) not found 

किसी को भी एक समाधान का पता है एक पंक्ति पर एक कनेक्शन वस्तु पारित करने के लिए?

धन्यवाद।

उत्तर

8

(मैं क्या विश्वास करते हैं) एक बेहतर तरीका है, कुछ खेल रहे हैं चारों ओर इस पोस्ट की खोज से पहले (मैं एक ही समस्या हो रही थी एक पाइप के माध्यम से एक पाइप पारित करने के लिए चाहता था।।) के बाद:

>>> from multiprocessing import Pipe, reduction 
>>> i, o = Pipe() 
>>> reduced = reduction.reduce_connection(i) 
>>> newi = reduced[0](*reduced[1]) 
>>> newi.send("hi") 
>>> o.recv() 
'hi' 

मैं मैं पूरी तरह से यह सुनिश्चित नहीं करता कि यह इस तरह क्यों बनाया गया है (किसी को मल्टीप्रोसेसिंग के कमी हिस्से के बारे में जानकारी की आवश्यकता होगी) लेकिन यह निश्चित रूप से काम करता है, और इसमें कोई अचार आयात की आवश्यकता नहीं होती है। इसके अलावा, यह उपरोक्त के करीब है जो यह करता है, लेकिन सरल है। मैंने इसे पायथन बग रिपोर्ट में भी फेंक दिया ताकि अन्य कामकाज के बारे में जान सकें।

+0

ग्रेट उत्तर। निश्चित रूप से एक बेहतर विकल्प दिखता है। –

+3

यह एक अच्छा जवाब है, और 2.6 में मेरे लिए काम कर रहा है। हालांकि, 2.7 में, जब समारोह 'कमी.rebuild_connection' AKA' कम [0] 'कहा जाता है, थ्रेड ब्लॉक अनिश्चित काल तक। –

+0

मुझे @SamMagura के समान समस्या है। क्या किसी को पाइथन 2.7 के लिए कामकाज के बारे में पता है? – redrah

7

यहाँ मोटे तौर पर है मैं क्या किया:

# Producer 
from multiprocessing.reduction import reduce_connection 
from multiprocessing import Pipe 

    # Producer and Consumer share the Queue we call queue 
def handle(queue): 
    reader, writer = Pipe() 
    pickled_writer = pickle.dumps(reduce_connection(writer)) 
    queue.put(pickled_writer) 

और

# Consumer 
from multiprocessing.reduction import rebuild_connection 

def wait_for_request(): 
    pickled_write = queue.get(block=True) # block=True isn't necessary, of course 
    upw = pickle.loads(pickled_writer) # unpickled writer 
    writer = upw[0](upw[1][0],upw[1][1],upw[1][2]) 

अंतिम पंक्ति गुप्त है, तो निम्न से आ रही:

>>> upw 
(<function rebuild_connection at 0x1005df140>, 
(('/var/folders/.../pymp-VhT3wX/listener-FKMB0W', 
17, False), True, True)) 

आशा है कि किसी मदद करता है। यह मेरे लिए ठीक काम करता है।

+0

धन्यवाद, यह एक बहुत ही उपयोगी उत्तर है, हम वास्तव में अटक गए थे! – EdwardAndo