gpt4 book ai didi

python - 如果连接到无效套接字,带有 python 的 Zeromq 会挂起

转载 作者:行者123 更新时间:2023-11-28 20:27:41 25 4
gpt4 key购买 nike

如果我用 pyzmq 连接到一个不存在的套接字,我需要按 CTRL_C 来停止程序。有人可以解释为什么会这样吗?

import zmq

INVALID_ADDR = 'ipc:///tmp/idontexist.socket'

context = zmq.Context()
socket = context.socket(zmq.REQ)

socket.connect(INVALID_ADDR)
socket.send('hello')

poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
conn = dict(poller.poll(1000))
if conn:
if conn.get(socket) == zmq.POLLIN:
print "got result: ", socket.recv(zmq.NOBLOCK)
else:
print 'got no result'

最佳答案

这个问题也是posted作为 GitHub 上的 pyzmq Issue。我将在这里解释我的解释(我希望这是合适的,我对 SO 还很陌生):

一般规则:如有疑问,zeromq 程序末尾的挂起是由于 LINGER。

这里的挂起是由 LINGER 套接字选项引起的,并且发生在脚本最后的垃圾收集期间调用的 context.term() 方法中。 LINGER 行为是 described在 zeromq 文档中,但简单地说,它是一个超时(以毫秒为单位)在关闭套接字之后等待处理队列中的任何未决消息,然后再丢弃消息。默认行为是 LINGER=-1,这意味着永远等待。

在这种情况下,由于没有对等点启动,当套接字试图关闭时,您尝试发送的“hello”消息仍在发送队列中等待。使用 LINGER=-1,ZeroMQ 将等到对等方准备好接收该消息后才会关闭。如果在该脚本明显挂起时将 RE​​P 套接字绑定(bind)到“ipc:///tmp/idontexist.socket”,消息将被传递并且脚本将完全退出。

如果您不希望您的脚本等待(正如您已经放弃获得回复的打印语句所示),请将 LINGER 设置为任何非负值(例如 socket.linger = 0), context.term() 将在等待指定的毫秒数后返回。

我应该注意到 INVALID_ADDR 变量名称暗示了一种理解,即与还没有监听器的接口(interface)的连接是无效的——这是不正确的。 zeromq 允许绑定(bind)/连接事件以任何顺序发生,如上述行为所示,在发送脚本阻塞 term() 时将 RE​​P 套接字绑定(bind)到接口(interface)。

关于python - 如果连接到无效套接字,带有 python 的 Zeromq 会挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7939977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com