用python语言实现zmq,当调用poller.poll()

用python语言实现zmq,当调用poller.poll()阻塞时候,时间设置为600秒,怎样让poller.poll()提前结束呢?用poller.close()和poller.interrupt()都报错,说没有这个函数,请问改如何解决这个问题?

这样看看:

import zmq

timeout = 600000  # 使用毫秒作为单位

context = zmq.Context()
sock = context.socket(zmq.PUSH)
sock.connect("tcp://localhost:5555")

poller = zmq.Poller()
poller.register(sock, zmq.POLLOUT)

# 结束轮询的条件
stop_time = time.monotonic() + timeout / 1000  # 以秒为单位
while True:
    # 计算剩余时间
    timeout_ms = max(0, int((stop_time - time.monotonic()) * 1000))
    # 调用 poll() 并设置超时时间
    events = dict(poller.poll(timeout=timeout_ms))
    if sock in events and events[sock] == zmq.POLLOUT:
        # 发送消息
        sock.send(b"Hello world")
    if time.monotonic() >= stop_time:
        # 在满足结束条件时退出
        break

# 清理资源
sock.close()
context.term()

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在Python中使用PyZMQ库实现zmq,当调用poller.poll()时设置超时时间,如果需要提前结束,可以使用poller.set_timeout()方法将超时时间设置为一个较短的值,然后在适当的时候再恢复原始的超时时间,例如:

import zmq

# 创建上下文和套接字
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.setsockopt_string(zmq.SUBSCRIBE, "")

# 创建Poller并注册套接字
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)

# 设置超时时间
poll_timeout = 600  # 600秒
poller.set_timeout(poll_timeout * 1000)  # 转换为毫秒

# 进行轮询
while True:
    try:
        events = dict(poller.poll())
    except zmq.error.ContextTerminated:
        break
    except zmq.error.Again:
        # 超时,进行一些处理,例如发送心跳包等
        print("poll timeout, do something...")
        # 将超时时间恢复为原始值
        poller.set_timeout(poll_timeout * 1000)
        continue

    # 处理事件
    if socket in events:
        message = socket.recv_string()
        print("received message:", message)

# 关闭套接字和上下文
socket.close()
context.term()

在上面的示例中,我们在进行轮询时设置了超时时间为600秒,如果poller.poll()在600秒内没有返回任何事件,就会抛出zmq.error.Again异常,然后在except语句块中进行一些处理,例如发送心跳包等。在处理完该异常后,我们将超时时间恢复为原始值,然后继续轮询。如果需要提前结束轮询,可以通过break语句跳出while循环。注意,在使用poller.set_timeout()方法设置超时时间时,需要将时间转换为毫秒。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢