代码之家  ›  专栏  ›  技术社区  ›  Роман Коптев

无法从python3django中使用zmq的函数返回

  •  0
  • Роман Коптев  · 技术社区  · 6 年前

    我使用python3.6.6anaconda64位windows,zmq4.2.5 我有一个很奇怪的行为:函数不能返回。

    import zmq
    import json
    
    def main():
        context = zmq.Context()
        socket = context.socket(zmq.REP)
        #socket.setsockopt(zmq.RCVTIMEO, 1000)
        socket.setsockopt(zmq.SNDTIMEO, 1000)
        socket.bind(my_address)
    
        def send_response(**kwargs):
            try:
                #... Some kwargs standard preprocessing
                socket.send_string(json.dumps(kwargs))
            except zmq.ZMQBaseError:
                return False
            return True
    
        while True:
            try:
                msg = socket.recv().decode("utf-8")
            except zmq.ZMQBaseError:
                continue
            #... Processing
            if not send_response(error='Everything is wrong'):
                continue
            #... Processing
    

    客户:

    import zmq
    import json
    
    def do_request(**kwargs):
        context = zmq.Context()
        socket = context.socket(zmq.REQ)
        socket.setsockopt(zmq.RCVTIMEO, 5000)
        socket.setsockopt(zmq.SNDTIMEO, 1000)
        socket.connect(my_address)
    
        #... kwargs pre-rocessing
        try:
            socket.send_string(json.dumps(kwargs))
            response = json.loads(socket.recv().decode("utf-8"))
            #... Processing
            return response
        except zmq.ZMQBaseError as e:
            print(e)
            print("PING1!!!")
            return dict(error='Service temporarily unavailable', r_status=503)
    
    def called_from_view():
        response = do_request(command='ping')
        print("PING2!!!")
    

    它起作用了。我不知道发生了什么变化。但现在它坏了。 do_request 不返回 Service temporarily unavailable response = json.loads(socket.recv().decode("utf-8")) 引发异常。在 except 部分python打印 PING1 ,但不打印 PING2 called_from_view 之后。即使是空的回报。我不明白为什么。

    在中创建新套接字 因为客户 从\u视图调用\u 从django的角度来看是这样的。我以前在使用全局套接字时遇到过其他问题。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jarcobi889    6 年前

    在客户端中创建套接字后添加此选项(也可以保留其他选项):

    socket = context.socket(zmq.REQ)
    socket.setsockopt(zmq.LINGER, True) # or False, my testing says it works both ways.
    

    this SO answer 供参考。基本上,垃圾收集者是在从垃圾箱回来的时候把垃圾捡起来 do_request