我使用pyzmq创建了简单的客户机/服务器。在
有一件事我不确定,.recv()
没有接收到消息,即使它是从服务器发送的。它只是忽略它,抛出一个我觉得奇怪的错误。在
客户端.py
try:
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:2222")
print("Sending request")
socket.send(b"send the message")
message = socket.recv(flags=zmq.NOBLOCK)
print("Received reply %s " % message)
except Exception as e:
print(str(e))
服务器.py
^{pr2}$我认为客户机应该接收Ack并打印它,而不是抛出异常。在
文件上说
With
flags=NOBLOCK
, this raisesZMQError
if no messages have arrived
显然,服务器在收到消息后立即用“Ack”响应。在
信息就是错误
Resource temporarily unavailable
ZeroMQ是在分布式系统中进行智能信令/消息传递的极好框架
让我们描绘一个主要是非阻塞的操作方法的演示,并给出一些关于在进程终止之前如何获得资源以及如何优雅地释放资源的一些启示。在
也许阅读一下部分的主要概念差异也会有所帮助。在
希望您能喜欢这个和更深入的实验StackOverflow resources如何最好地利用ZeroMQ Zen of Zero的所有能力:
Server.py
^{pr2}$Client.py
请记住,在并发环境中,不能保证独立进程的执行顺序。即使您正在立即响应
server.py
中的消息,在您调用socket.recv
之前,响应可能无法到达接收套接字。{3当你的客户端需要回拨你的消息时,你需要回你的服务器,然后通过网络返回你的消息。通过网络发送消息的时间会很长,您将在socket.send
之后立即调用socket.recv
。在因此,实际上,当您调用},而且由于您使用的是
message = socket.recv(flags=zmq.NOBLOCK)
时,客户机socket
还没有从服务器接收到{NOBLOCK
,因此会抛出一个错误,因为socket
上没有收到任何消息。在NOBLOCK
在这种情况下可能不合适。您可以通过在send
和recv
之间添加一个sleep
调用来证明等待服务器响应的时间延迟确实是问题所在,但对于客户端代码来说,这不是一个好的解决方案。在如果要在等待一定时间后退出,则应使用
socket.poll
。https://pyzmq.readthedocs.io/en/latest/api/zmq.html#zmq.Socket.poll您使用的是非阻塞模式,这意味着它将引发一个错误来通知您,消息无法处理,您应该稍后再试,但是如果您使用的是阻塞模式,它将阻止,直到对等方连接。在
这个答案来自here
基本上,如果你删除
flags=zmq.NOBLOCK
它就可以工作了。在更新
如果你想使用非阻塞模式,你应该看看this
相关问题 更多 >
编程相关推荐