ZMQ连接和推送-如何确定其是否失败

时间:2018-10-22 21:06:36

标签: python zeromq pyzmq

我有一个简单的ZMQ程序,它建立一个zmq.PUSH套接字connects,然后尝试发送消息。

import zmq

zcontext = zmq.Context()
zsock = zcontext.socket(zmq.PUSH)
zsock.connect("tcp://localhost:12345")

with open(sys.argv[1]) as f:
   for line in f:
       zsock.send(line)

当另一边在那里时,此方法工作正常。但是,如果另一侧的侦听器存在任何问题(例如,忘记启动侦听器,或者我连接到错误的端口),则它会在尝试发送大约1000条消息后挂起(取决于默认队列的大小)。

正确的做法是什么?如果另一端有任何问题,我宁愿只打印一条错误消息并正常退出。

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码段获取zmq.error

import zmq
import time

zcontext = zmq.Context()
zsock = zcontext.socket(zmq.PUSH)
zsock.connect("tcp://localhost:12345")

try:
    with open(sys.argv[1]) as f:
        for line in f:
            zsock.send(line, flags=NOBLOCK)
            time.sleep(.1)

except zmq.ZMQError as exc:
    print(exc)

[注意]:

  • 您可以使用以上代码中的.connect()来更改.bind()方法,也可以将另一边bind更改为connect以用于测试用例。< / p>

  • .bind()中应使用127.0.0.1而不是localhost


[更新]:

  
      
  • 使用flags=NOBLOCK方法中的.send(),如果队列已满,则会引发ZMQError;否则,它将等待直到可用空间。   因此,在这种情况下,将如下所示:

         

    zsock.send(line, flags=NOBLOCK)

  •