【问题标题】:ZMQ connect and push - how to determine if it failsZMQ连接和推送——如何判断是否失败
【发布时间】:2018-10-30 07:41:29
【问题描述】:

我有一个简单的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 条消息后挂起(取决于默认队列的大小)。

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

【问题讨论】:

  • 你试过flags=NOBLOCK吗?

标签: python zeromq pyzmq


【解决方案1】:

您可以使用以下 sn-p 代码获取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作为测试用例。

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


[更新]:

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

    zsock.send(line, flags=NOBLOCK)

【讨论】:

  • 我认为这行不通。你试过了吗?它只是尝试将其发送到套接字而不抛出异常
  • 为什么不行?!如果你在这个循环中有错误,你会知道的。
  • 我试过了。选择了一个没有人听的随机端口。它不会抛出异常
  • 1000 次迭代循环后仍然挂起?
  • 是的。我认为 1000 可能是默认队列大小。它上升到 1000,然后挂起。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2019-02-15
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
相关资源
最近更新 更多