Domanda

Dato questo bug (Python Issue 4892) che genera il seguente errore:

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

Qualcuno conosce una soluzione alternativa per passare un oggetto Connessione su una coda?

Grazie.

È stato utile?

Soluzione

(Quello che credo sia) Un metodo migliore, dopo aver giocato un po '(stavo avendo lo stesso problema. Volevo passare una pipa attraverso una pipa.) Prima di scoprire questo post:

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

Non sono del tutto sicuro del perché questo sia stato costruito in questo modo (qualcuno avrebbe bisogno di informazioni su cosa diavolo la parte di riduzione del multiprocessing comporta per questo) ma funziona sicuramente e non richiede importazione di sottaceti. Oltre a ciò, è abbastanza vicino a quanto sopra in quello che fa, ma più semplice. L'ho anche inserito nel rapporto sui bug di Python in modo che altri conoscano la soluzione alternativa.

Altri suggerimenti

Ecco all'incirca quello che ho fatto:

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

e

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

L'ultima riga è criptica, proveniente da quanto segue:

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

Spero che aiuti qualcun altro. Funziona bene per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top