Python 2.6 отправляет объект соединения через очередь / Канал / etc

StackOverflow https://stackoverflow.com/questions/1446004

Вопрос

Данный эта ошибка (проблема Python 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

Кто-нибудь знает об обходном пути для передачи объекта Connection в очередь?

Спасибо.

Это было полезно?

Решение

(я верю в это). Лучший способ, после некоторой тренировки (у меня возникла та же проблема. Хотел пропустить трубу через трубу.), прежде чем открыть этот пост:

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

Я не совсем уверен, почему это построено таким образом (кому-то понадобится понять, какого черта для этого предназначена редукционная часть многопроцессорной обработки), но она определенно работает и не требует импорта консервантов. Кроме этого, он довольно близок к тому, что делает, но проще. Я также добавил это в отчет об ошибках Python, чтобы другие знали об обходном пути.

Другие советы

Вот примерно что я сделал:

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

Надеюсь, это поможет кому-то еще.У меня это прекрасно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top