通过Ø发送python多处理连接;MQ

通过Ø发送python多处理连接;MQ,python,sockets,multiprocessing,pipe,zeromq,Python,Sockets,Multiprocessing,Pipe,Zeromq,我想通过ØMQ发送连接对象。有太多的方面:生产者(发送连接)和接受者(接收此连接) producer.py import zmq import time from multiprocessing import Pipe from multiprocessing.reduction import reduce_connection context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5556"

我想通过
ØMQ
发送
连接
对象。有太多的方面:生产者(发送
连接
)和接受者(接收此
连接

producer.py

import zmq
import time
from multiprocessing import Pipe
from multiprocessing.reduction import reduce_connection

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5556")

time.sleep(1)

a, b = Pipe()
reduced_a = reduce_connection(a)
socket.send_pyobj(reduced_a)

print b.recv()
import zmq
import time
from multiprocessing import Pipe, current_process
from multiprocessing.reduction import reduce_connection

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5556")

time.sleep(1)

a, b = Pipe()
reduced_a = reduce_connection(a)
socket.send_pyobj(reduced_a)
socket.send(current_process().authkey)

print b.recv()
接收器.py

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect ("tcp://localhost:5556")
socket.setsockopt(zmq.SUBSCRIBE, '')

obj = socket.recv_pyobj()
answer_conn = obj[0](obj[1][0],obj[1][1],obj[1][2])
# answer_conn = obj[0](*obj[1])

answer_conn.send('All is OK!')
import zmq
from multiprocessing import reduction

def rebuild_handle_with_key(pickled_data, authkey=None):
    from multiprocessing import current_process
    from multiprocessing.util import sub_debug
    from multiprocessing.connection import Client
    from multiprocessing.reduction import recv_handle
    import os
    address, handle, inherited = pickled_data
    if inherited:
        return handle
    sub_debug('rebuilding handle %d', handle)
    conn = Client(address, authkey=authkey or current_process().authkey)
    conn.send((handle, os.getpid()))
    new_handle = recv_handle(conn)
    conn.close()
    return new_handle

def rebuild_connection_with_key(reduced_handle, readable, writable, authkey=None):
    import _multiprocessing
    handle = rebuild_handle_with_key(reduced_handle, authkey)
    return _multiprocessing.Connection(
        handle, readable=readable, writable=writable
        )

reduction.rebuild_connection = rebuild_connection_with_key

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect ("tcp://localhost:5556")
socket.setsockopt(zmq.SUBSCRIBE, '')

obj = socket.recv_pyobj()
authkey = socket.recv()
answer_conn = obj[0](obj[1][0],obj[1][1],obj[1][2], authkey)
# answer_conn = obj[0](*obj[1])

answer_conn.send('All is OK!')
在重新建立连接时:

    answer_conn = obj[0](obj[1][0],obj[1][1],obj[1][2])
  File "/usr/lib/python2.7/multiprocessing/reduction.py", line 170, in rebuild_connection
    handle = rebuild_handle(reduced_handle)
  File "/usr/lib/python2.7/multiprocessing/reduction.py", line 155, in rebuild_handle
    conn = Client(address, authkey=current_process().authkey)
  File "/usr/lib/python2.7/multiprocessing/connection.py", line 175, in Client
    answer_challenge(c, authkey)
  File "/usr/lib/python2.7/multiprocessing/connection.py", line 420, in answer_challenge
    raise AuthenticationError('digest sent was rejected')
multiprocessing.AuthenticationError: digest sent was rejected
有人知道可以帮助传递
连接的东西吗


谢谢

您必须使用连接所有者的进程(生产者)authkey来重建接收器上的句柄。您可以通过ØMQ发送生产者的authkey和pickle连接

producer.py

import zmq
import time
from multiprocessing import Pipe
from multiprocessing.reduction import reduce_connection

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5556")

time.sleep(1)

a, b = Pipe()
reduced_a = reduce_connection(a)
socket.send_pyobj(reduced_a)

print b.recv()
import zmq
import time
from multiprocessing import Pipe, current_process
from multiprocessing.reduction import reduce_connection

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5556")

time.sleep(1)

a, b = Pipe()
reduced_a = reduce_connection(a)
socket.send_pyobj(reduced_a)
socket.send(current_process().authkey)

print b.recv()
接收器.py

import zmq

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect ("tcp://localhost:5556")
socket.setsockopt(zmq.SUBSCRIBE, '')

obj = socket.recv_pyobj()
answer_conn = obj[0](obj[1][0],obj[1][1],obj[1][2])
# answer_conn = obj[0](*obj[1])

answer_conn.send('All is OK!')
import zmq
from multiprocessing import reduction

def rebuild_handle_with_key(pickled_data, authkey=None):
    from multiprocessing import current_process
    from multiprocessing.util import sub_debug
    from multiprocessing.connection import Client
    from multiprocessing.reduction import recv_handle
    import os
    address, handle, inherited = pickled_data
    if inherited:
        return handle
    sub_debug('rebuilding handle %d', handle)
    conn = Client(address, authkey=authkey or current_process().authkey)
    conn.send((handle, os.getpid()))
    new_handle = recv_handle(conn)
    conn.close()
    return new_handle

def rebuild_connection_with_key(reduced_handle, readable, writable, authkey=None):
    import _multiprocessing
    handle = rebuild_handle_with_key(reduced_handle, authkey)
    return _multiprocessing.Connection(
        handle, readable=readable, writable=writable
        )

reduction.rebuild_connection = rebuild_connection_with_key

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect ("tcp://localhost:5556")
socket.setsockopt(zmq.SUBSCRIBE, '')

obj = socket.recv_pyobj()
authkey = socket.recv()
answer_conn = obj[0](obj[1][0],obj[1][1],obj[1][2], authkey)
# answer_conn = obj[0](*obj[1])

answer_conn.send('All is OK!')

我找不到更好的方法来进行多处理。请使用不同的authkey,因此我在这里对其进行了修补。

仅重建一次连接时效果良好。但第二次,它在recv_handle return_multiprocessing.recvfd(conn.fileno())键盘中断中的第83行“File”/usr/lib/python2.7/multiprocessing/reduce.py”上停止`