无法从 python 3 django 中使用 zmq 的函数中 return
Cannot return from function that uses zmq in python 3 django
我用的是python3.6.6 anaconda 64位windows,zmq 4.2.5
我的行为很奇怪:函数不能 return.
服务器:
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
不会 return Service temporarily unavailable
。 response = json.loads(socket.recv().decode("utf-8"))
抛出异常。在 except
部分 python 中打印 PING1
,但之后在 called_from_view
中不打印 PING2
。即使空return。我不明白为什么。
我在 do_request
中创建了新套接字,因为客户端的 called_from_view
是从 django 的视图中调用的。我之前在使用全局套接字时遇到过其他问题。
在客户端中创建套接字后添加此选项(您也可以保留其他选项):
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 套接字阻止它完成并无限期挂起。
我用的是python3.6.6 anaconda 64位windows,zmq 4.2.5 我的行为很奇怪:函数不能 return.
服务器:
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
不会 return Service temporarily unavailable
。 response = json.loads(socket.recv().decode("utf-8"))
抛出异常。在 except
部分 python 中打印 PING1
,但之后在 called_from_view
中不打印 PING2
。即使空return。我不明白为什么。
我在 do_request
中创建了新套接字,因为客户端的 called_from_view
是从 django 的视图中调用的。我之前在使用全局套接字时遇到过其他问题。
在客户端中创建套接字后添加此选项(您也可以保留其他选项):
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 套接字阻止它完成并无限期挂起。