用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()方法设置超时时间时,需要将时间转换为毫秒。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢