ZeroMQ REQ / REP服务器错误处理

时间:2014-02-07 21:35:45

标签: zeromq pyzmq

我正在尝试使用ZeroMQ rep / req,但无法弄清楚如何处理服务器端错误。查看here中的代码:

socket.bind("tcp://*:%s" % port)
while True:
    #  Wait for next request from client
    message = socket.recv()
    print "Received request: ", message
    time.sleep (1)  
    socket.send("World from %s" % port)

我的问题是如果客户端调用socket.send()然后挂起或崩溃会发生什么。服务器不会永远卡在socket.send()或socket.recv()上吗?

请注意,TCP套接字不是问题。使用TCP套接字,我可以简单地断开连接。使用ZMQ,我可以隐式管理连接,但我不知道是否可以打破“会话”或“连接”并重新开始。

3 个答案:

答案 0 :(得分:6)

您可以像终止TCP套接字一样终止ZMQ套接字。

socket.close()

如果你需要等待一条消息,但只有一段有限的时间,你可以将timeout标志传递给socket.recv(timeout=1024),然后像处理时一样处理超时错误情况。 TCP套接字超时或断开连接。如果您需要管理多个可能处于错误状态的套接字,那么Poller类将允许您完成此操作。

答案 1 :(得分:2)

ZMQ Z-guide提供了很多关于如何构建服务以处理不同场景的好提示。

我认为你可能感兴趣chapter 4,尤其是懒惰海盗模式。

查看Lazy Pirate ServerLazy Pirate Client的示例。

答案 2 :(得分:0)

一般来说,

  1. 确保套接字上setsockopt() sendrecv不会永久阻止。 (临时阻止 - 无论是客户端还是服务器 - 都可以,但无限阻塞是不好的,因为你的应用程序不能做任何事情)
  2. 如果任何I / O出错,
    • 如果您是客户端,close()当前套接字并重新创建新套接字以建立新连接
    • 如果您是服务器,则没有其他事可做,您只是在等待新连接。您需要探索Poller课程。