通过Ø发送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”上停止`