Frage

Bei dieser Fehler (Python Ausgabe 4892) , die zu dem folgenden Fehler gibt:

>>> 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

Kennt jemand dieses Problem zu umgehen in einer Warteschlange ein Connection-Objekt zu übergeben?

Danke.

War es hilfreich?

Lösung

(Was ich glaube, ist) Eine bessere Methode, nach einigen Herumspielen (ich war das gleiche Problem Will ein Rohr durch ein Rohr zu übergeben..), Bevor dieses Amt zu entdecken:

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

Ich bin nicht ganz sicher, warum dies so gebaut ist (jemand Einblick in brauchen würde, was zum Teufel der Reduktion Teil Multiprozessing ist etwa für die), aber es funktioniert auf jeden Fall funktionieren und erfordert keine Gurke Import. Other than that, es ist ziemlich nahe an den oben in dem, was es tut, aber einfacher. Ich warf auch diese in den Bericht Python Fehler, so dass andere der Abhilfe kennen.

Andere Tipps

Hier ist ungefähr das, was ich getan habe:

# 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)

und

# 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])

Die letzte Zeile ist kryptisch, kommt aus dem folgenden:

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

Hoffnung, dass jemand anderes hilft. Es funktioniert gut für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top