python-3.x - 使用 zmq.Poller() 为我的 REQ/REP zmqclient 添加超时,但该函数不返回任何内容
问题描述
我想为我的 0MQ 客户端添加超时。
我试过了zmq.Poller()
。它似乎在一开始就起作用。但是当我将代码移动到一个函数中时,我发现它没有返回任何东西。它只是卡在那里。
我有两条打印线。
第一次打印:
我zmq_Response
在这个函数返回之前成功打印了结果。但是当涉及到下一行时,什么都没有返回。
第二次打印:
我想这就是我最后一次打印不起作用的原因。
def send_message():
context = zmq.Context()
zmq_Socket = context.socket(zmq.REQ)
zmq_Socket.connect('tcp://localhost:5000')
zmq_Data = {'Register': 'default'}
zmq_Socket.send_string(json.dumps(zmq_Data), flags=0, encoding='utf8')
poller = zmq.Poller()
poller.register(zmq_Socket, flags=zmq.POLLIN)
if poller.poll(timeout=1000):
zmq_Response = zmq_Socket.recv_json()
else:
# raise IOError("Timeout processing auth request")
zmq_Response = {'test': 'test'}
poller.unregister(zmq_Socket)
print(zmq_Response) # **This print works!**
return zmq_Response
res = send_message()
print(res)
预计会打印zmq_Response
,但不会。
解决方案
我现在解决...
似乎当 zmq_LINGER 的值为默认值,即 -1 时,上下文将等到消息发送成功后才允许终止。
所以我在超时分支将 zmq_LINGER 设置为 1。它现在有效。
def send_message():
context = zmq.Context()
zmq_Socket = context.socket(zmq.REQ)
zmq_Socket.connect('tcp://localhost:5000')
zmq_Data = {'Register': 'default'}
zmq_Socket.send_string(json.dumps(zmq_Data), flags=0, encoding='utf8')
poller = zmq.Poller()
poller.register(zmq_Socket, flags=zmq.POLLIN)
if poller.poll(timeout=1000):
zmq_Response = zmq_Socket.recv_json()
else:
# --------------------------------------------
# I change the value of zmq.LINGER here.
zmq_Socket.setsockopt(zmq.LINGER, 1)
# --------------------------------------------
zmq_Response = {'test': 'test'}
poller.unregister(zmq_Socket)
print(zmq_Response)
return zmq_Response
res = send_message()
print(res)
推荐阅读
- python-sphinx - 如何使用 sphinx 创建一个链接以在 rst 中下载目录?
- accessibility - Jaspersoft Studio 不支持工件标记。有解决方法吗?
- react-native - 在标题中显示自定义组件
- java - 调用 GL30.glGenVertexArrays() 时出错;
- c - 这个字符串比较程序如何处理相同大小的字符串?
- cuda - 使用 cudaEventRecord() 记录多 GPU 程序的 CUDA 内核的运行时间
- c# - System.Text.Json 序列化多个对象/数组
- select - h2数据库选择查询慢
- visual-studio - 从电子邮件中检索纯文本正文
- c# - 使用 BindingSource 和 Validate 数据内联添加行