我想使用ZeroMQ在Python程序和Ruby程序之间建立简单的连接,我正在尝试使用PAIR连接,但我一直无法。
这是我在python(服务器)中的代码:
import zmq
import time
port = "5553"
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind("tcp://*:%s" % port)
while True:
socket.send(b"Server message to client3")
print("Enviado mensaje")
time.sleep(1)
在连接客户端之前,它不会显示任何内容。
这是Ruby(客户端)中的代码
require 'ffi-rzmq'
context = ZMQ::Context.new
subscriber = context.socket ZMQ::PAIR
subscriber.connect "tcp://localhost:5553"
loop do
address = ''
subscriber.recv_string address
puts "[#{address}]"
end
ruby脚本只是冻结,它不打印任何内容,而python脚本开始打印Enviando mensaje
B.T.W:我正在使用Python 3.6.9和Ruby 2.6.5
在Ruby和Python之间连接zmq PAIR
的正确方法是什么?
欢迎来到零之禅![如果有人从未使用过ZeroMQ,在深入探讨更多细节之前,您可能会喜欢先看“ ZeroMQ Principles in less than Five Seconds”
Q:在连接客户端之前,它不会显示任何内容。
[当然,不是这样,您必须强制您的代码阻塞,直到PAIR/PAIR
传递通道能够传递消息为止。正如v4.2 + API所定义的那样,.send()
方法将在“ 静音状态”的所有持续时间内阻塞。
中的更多内容),并且根据经验也最好包括当
套接字由于已达到所连接对等设备的高水位线而进入静音状态时,或者如果未连接任何对等设备,则任何ZMQ_PAIR
zmq_send
(3)套接字上的操作应阻塞,直到对等体可以发送为止;消息不会被丢弃。可以尝试非阻塞发送模式(始终是防止阻塞的良好工程实践的标志,distributed-computing
<aSocket>.close()
和<aContext>.term()
(最好使用显式.setsockopt( zmq.LINGER, 0 )
)以避免挂断,并且作为一种良好的工程实践,应显式关闭资源并将其释放回系统。socket.send( b"Server message #[_{0:_>10d}_] to client3".format( i ), zmq.NOBLOCK )
最后但并非最不重要:
Q
:在Ruby和Python之间连接zmqPAIR
的正确方法是什么?如API文档所述:
,并且应牢记这一点。[[
套接字设计用于通过ZMQ_PAIR
zmq_inproc
(7)传输进行线程间通信,并且not实现诸如自动重新连接之类的功能。没有最佳方法,因为Python / Ruby不是线程间通信的情况。 ZeroMQ自v2.1 +起已明确警告,
PAIR/PAIR
原型是experimental
[总是可以用串联的[[PUSH/PULL
.send()
+仅.recv()
的通道提供相同的舒适度。