Python 2.6 send connection object over Queue / Pipe / etc

后端 未结 2 1810
野性不改
野性不改 2020-12-30 08:02

Given this bug (Python Issue 4892) that gives rise to the following error:

>>> import multiprocessing
>>> multiprocessing.allow_connection_         


        
相关标签:
2条回答
  • 2020-12-30 08:39

    Here's roughly what I did:

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

    and

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

    The last line is cryptic, coming from the following:

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

    Hope that helps someone else. It works fine for me.

    0 讨论(0)
  • 2020-12-30 08:40

    (What I believe is) A better method, after some playing around (I was having the same problem. Wanted to pass a pipe through a pipe.) before discovering this 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'
    

    I'm not entirely sure why this is built this way (someone would need insight into what the heck the reduction part of multiprocessing is about for that) but it does definitely work, and requires no pickle import. Other than that, it's pretty close to the above in what it does, but simpler. I also threw this into the python bug report so others know of the workaround.

    0 讨论(0)
提交回复
热议问题