无法从在python 3 django中使用zmq的函数返回

时间:2018-09-20 20:40:39

标签: python django python-3.x zeromq

我使用python 3.6.6 anaconda 64位Windows,zmq 4.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 unavailableresponse = json.loads(socket.recv().decode("utf-8"))引发异常。在except部分中,python打印PING1,但此后不打印PING2中的called_from_view。即使有空回报。我不知道为什么。

我在do_request中创建了新的套接字,因为从django的角度调用了客户端的called_from_view。在使用全局套接字之前,我还有其他问题。

1 个答案:

答案 0 :(得分:1)

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

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

请参阅this SO answer以供参考。基本上,垃圾收集器会在从do_request返回时尝试捡拾碎片,而zmq套接字正在阻止垃圾回收完成并无限期挂起。