PyZMQ 套接字在函数中创建时无法发送

PyZMQ socket's fail to send when created in function

使用 PyZMQ,当我尝试在函数内创建套接字并使用它发送消息时,我从未收到消息。

context = zmq.Context()

def sender():                                          
    sock = context.socket(zmq.PUB)
    sock.connect("tcp://localhost:44444")
    sock.send("status good")

sender()

但是,如果我在全局范围内创建套接字,它会起作用:

context = zmq.Context()
sock = context.socket(zmq.PUB)
sock.connect("tcp://localhost:44444")
sock.send("status good")

更奇怪的是,检查底层文件描述符上的事件显示事件确实发生了。但是,使用 getsockopt(EVENTS) 检查轮询值表明没有任何内容可从套接字读取。

我试过让函数在退出前休眠几秒钟,这样订阅者就有足够的时间在套接字被销毁之前阅读消息。但这并没有改变任何东西。

简单的解决方案。我忘记了使用 ZMQ 在发送数据之前必须等待连接后。一秒钟的睡眠可能就足够了,尽管在生产代码中使用的方法不是很可靠。

context = zmq.Context()

def sender():                                          
    sock = context.socket(zmq.PUB)
    sock.connect("tcp://localhost:44444")
    time.sleep(1)
    sock.send("status good")

sender()

在连接完全建立之前发送的任何消息都将被丢弃。