Ruby a Python之间的ZeroMQ PAIR / PAIR连接

问题描述 投票:1回答:1

我想使用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的正确方法是什么?

python ruby zeromq
1个回答
1
投票

欢迎来到零之禅![如果从未使用过ZeroMQ,在深入探讨更多细节之前,您可能会喜欢先看“ ZeroMQ Principles in less than Five Seconds

Q在连接客户端之前它不会显示任何内容。

[当然,不是这样,您必须强制性地阻塞您的代码,直到PAIR/PAIR传递通道能够传递消息为止。如v4.2 + API所定义,.send()方法将在“ 静音状态”的所有持续时间内阻塞。

ZMQ_PAIR

套接字由于已达到所连接对等设备的高水位线而进入静音状态时,或者如果未连接对等设备,则任何zmq_send(3)套接字上的操作应阻塞,直到对等体可以发送为止;消息不会被丢弃。

可以尝试非阻塞发送模式(始终是防止阻塞的良好工程实践的标志,

中的更多内容),并且根据经验,最好还包括<aSocket>.close()<aContext>.term() (最好与显式.setsockopt( zmq.LINGER, 0 )一起使用)以避免挂断,并且作为一种良好的工程实践,应显式关闭资源并将其释放回系统中]
socket.send( b"Server message #[_{0:_>10d}_] to client3".format( i ), zmq.NOBLOCK )

最后但并非最不重要:

Q

在Ruby和Python之间连接zmq PAIR的正确方法是什么?

如API文档所述:

[[ZMQ_PAIR

套接字设计用于通过zmq_inproc(7)传输进行线程间通信,并且not实现诸如自动重新连接之类的功能。

没有最佳方法,因为Python / Ruby不是线程间通信的情况。 ZeroMQ自v2.1 +起已明确警告,PAIR/PAIR原型是experimental

,并且应牢记这一点。

[一个人总是可以用串联的[[PUSH/PULL

-简单通道替换每个这样的用例,并通过一对仅.send() +仅.recv()的通道提供相同的舒适度。
© www.soinside.com 2019 - 2024. All rights reserved.