الثعبان كائن اتصال 2.6 الإرسال على قائمة الانتظار / أنابيب / الخ
-
22-07-2019 - |
سؤال
هذا الخطأ (بايثون العدد 4892) أن يؤدي إلى الخطأ التالي:
>>> 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
لا أحد يعرف من الحل لتمرير كائن اتصال على قائمة الانتظار؟
وشكرا لكم.
المحلول
و(ما أعتقد هو) وهناك طريقة أفضل، بعد بعض اللعب حولها (كنت أعاني من نفس المشكلة مطلوب لتمرير أنبوب من خلال أنبوب.) قبل اكتشاف هذا المنصب:
>>> from multiprocessing import Pipe, reduction
>>> i, o = Pipe()
>>> reduced = reduction.reduce_connection(i)
>>> newi = reduced[0](*reduced[1])
>>> newi.send("hi")
>>> o.recv()
'hi'
وأنا لست متأكدا تماما لماذا هذا هو مبني بهذه الطريقة (شخص ما من شأنه تحتاج نظرة ثاقبة ما هيك الجزء الحد من متعدد المعالجة حوالي لذلك) ولكنه بالتأكيد العمل، ويتطلب أي استيراد المخلل. بخلاف ذلك، انها قريبة جدا إلى ما سبق في ما تقوم به، ولكن أبسط. وأود أيضا أن ألقى هذا في تقرير الشوائب الثعبان بحيث الآخرين يعرفون من الحل.
نصائح أخرى
وهنا تقريبا ما فعلته:
# 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))
وعلى أمل أن يساعد شخص آخر. أنه يعمل بشكل جيد بالنسبة لي.