首页 > 解决方案 > 使用 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,但不会。

标签: python-3.xzeromqdistributed-computingpyzmq

解决方案


我现在解决...

似乎当 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)

推荐阅读