ZeroMQ:如何在python和节点之间保持PAIR/PAIR连接?
我有一个python服务器和一个node.js客户端。问题是,当我重新启动node.js脚本时,它不会重新连接 另外,我不明白的是为什么python上有一个无限循环。我不能使用事件侦听连接 下面是服务器和客户端ZeroMQ:如何在python和节点之间保持PAIR/PAIR连接?,python,node.js,zeromq,distributed-computing,Python,Node.js,Zeromq,Distributed Computing,我有一个python服务器和一个node.js客户端。问题是,当我重新启动node.js脚本时,它不会重新连接 另外,我不明白的是为什么python上有一个无限循环。我不能使用事件侦听连接 下面是服务器和客户端 此外,这仅在服务器先启动然后客户端启动时有效。如何使客户端重新尝试,直到连接为止?根据《zmq指南》,配对套接字用于同一进程中的线程间通信。预期用途是绑定父线程,然后将套接字上下文传递给子线程,并将其作为一对/对组合连接到父线程套接字 专用对,专门连接两个插座。这是一个 在一个进程中
此外,这仅在服务器先启动然后客户端启动时有效。如何使客户端重新尝试,直到连接为止?根据《zmq指南》,配对套接字用于同一进程中的线程间通信。预期用途是绑定父线程,然后将套接字上下文传递给子线程,并将其作为一对/对组合连接到父线程套接字 专用对,专门连接两个插座。这是一个 在一个进程中连接两个线程的模式,不要混淆 具有“正常”对插座 对于进程间通信,应该使用req/rep、pub/sub或其他模式。如果您需要简单可靠的进程间(有很多级别的可靠性),客户机可以在其中处理服务器,请查看
lazy-pirate
模式
Q:“…当我重新启动节点.js
脚本时,它不会重新连接。”
好的,有一些技巧可以解决这个问题,但是公平地说,ZeroMQ版本和实际的第三方语言包装器/绑定版本(以及遵守当时有效的API文档属性的严格程度)都很重要
socket(zmq.PAIR)
-如v4.3.2 API中所述,实例在生产中的行为有两个主要区别:
a) 配对
-socket原型,在进入RTO状态并接受了成功连接(…)的传入对等方后,将永远不会接受“另一个”.connect()
的到来
b) 对
-套接字原型在其他常见的原型上不工作,低级别传输类连接管理服务,因此不要期望任何自动“自动重新连接”或智能接收新的,几乎。。。“free”再次出现,.connect()
-内部未完成处理“旧”对等互连套接字期间的连接仍然处于tcp传输类的关闭状态
尽管如此,我们仍然可以在内置的原型原语之上创建自己的智能元层来处理任何此类行为。如果有疑问,请记住Zero原则的禅宗,它是在ZeroMQ中精心制作的。可能会找到进一步的灵感,如果没有完整的背景,也可以尝试更广泛的内容
让我介绍一些可能在这方面提高免疫力的方法:
.setsockopt(zmq.LINGER,0)
,以避免在已断开的互连上对死点进行“直到永远”的等待
.setsockopt(zmq.IMMEDIATE)
,以防止在未准备传输的互连上缓冲任何消息以“稍后”传递
.recv()
-方法的非阻塞形式设计所有代码,实际上,始终-您的代码将在msg=socket.recv()行上永远无法恢复阻塞,如果远程对等方尚未发送任何消息,或者由于任何原因永远不会发送任何下一条消息,则该消息将在剩余时间内保持不变。始终使用.recv(zmq.NOBLOCK)
和
进行一次---预先轮询任何准备就绪的东西的备份状态
,然后执行.recv(zmq.NOBLOCK)
使用.poll(SomeContextSpecificEasibleWaitingTime)
或进行一次---后.recv(zmq.NOBLOCK)
对于所有情况的处理,.recv(zmq.NOBLOCK)
实际上没有什么可以期待的,因此调用.recv(zmq.NOBLOCK)
方法确实会得到一个空的nothing
Q:“另外,我不明白的是为什么python上有一个无限循环。我不能使用事件来侦听连接。” 嗯,循环更简单,主要避免了多个事件循环框架之间的“冲突”(在Tkinter的案例中非常常见,
mainloop()
通常会逐出所有其他事件处理程序,“协作”事件处理框架几乎是一种矛盾修饰法)
循环是简单、纯粹的-
[SERIAL]
代码执行结构(还记得GIL lock截断代码执行时间的实际流程)并且是安全的。我所需要做的就是添加监控。谢谢socket.Monitor请不要在问题中添加“已解决”。如果你想发布自己的答案并接受它,那很好。在ZeroMQ工作了12年多之后,我很难同意你上面的说法。我敢推荐这些,即这里的REQ/REP原型。我没有你的经验,我只是引用指南,我看到其他人使用PAIR/PAIR进行节间通信。那么,您是说在节间或进程间使用PAIR/PAIR是好的(只要您首先启动服务器,并且可能执行您提到的其他非阻塞技巧)?随着ZeroMQ版本的发展,“独占”PAIR可伸缩正式通信模式原型是什么或对什么也不有用。在v2.1中,我们都被警告说它“纯粹是一种实验类型”(以后不再使用),但我们使用PAIR来实现其非常具体的属性组合(请参见中的RFC规范31/EXPAIR)&我们很高兴将其用于TCP/IP内部网基础设施w/tuned.setsockopt()-s。在inproc://transports上,它甚至创建了MEM映射的u-low-latency IO chnls!
context = zmq.Context()
socket = context.socket(zmq.PAIR)
print("Binding socket to port: " + str(port))
socket.bind("tcp://*:%s" % port)
print("Connection has been established")
while True: // cant we listen for events here i.e on connection etc
msg = socket.recv()
print(msg)
socket.send("Server response")
'use strict';
var globevt = require('../lib/emitter');
var sprintf = require("sprintf-js").sprintf;
var logger = require('../lib/logat');
var zmq = require('zeromq')
, socket = zmq.socket('pair');
const fs = require('fs');
socket.connect('tcp://127.0.0.1:3000');
socket.on('message', function (msg) {
console.log(msg);
});