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

Python ZMQ连接和推送-如何确定是否失败,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,我有一个简单的ZMQ程序,它建立一个ZMQ.PUSH套接字,连接,然后尝试发送消息 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) 当另一面在那里时,这种方法可以很好地工作。但是,如

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

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条消息后挂起(取决于默认队列的大小)


正确的做法是什么?若对方有任何问题,我宁愿打印一条错误消息,然后优雅地退出

您可以使用以下代码片段获取
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)

[注意]:

  • 您可以使用上述代码中的
    .bind()
    更改
    .connect()
    方法,还可以将测试用例的另一端
    bind
    更改为
    connect

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


[更新]:

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

    zsock.send(行,标志=NOBLOCK)


我认为那不管用。你试过了吗?它只是试着把它送下插座而不抛出异常为什么不工作?!如果你在这个循环中有错误,你会知道的。我试过了。选择了一个没有人监听的随机端口。它不会抛出异常直到1000次循环后被挂起?是的。我认为1000可能是默认的队列大小。它上升到1000,然后挂起。您是否尝试过使用
flags=NOBLOCK