如何解决在flask-socketiowebsockets中连续发射这是正确的方法吗?
背景信息
我正在Flask网站上工作,需要从服务器获取实时数据。为此,我使用flask-socketio
实现了一个解决方案:
import eventlet
eventlet.monkey_patch()
from .. import socketio # SocketIO object defined in parent
from flask import session,request
@socketio.on('get_info_test')
@login_required_ws
def get_info():
result = {"result": None,"data": None}
try:
result["data"] = get_test_data(session.get("user_id")) # get data for user
result["result"] = "success"
except:
result["result"] = "Unknown error while getting data"
finally:
return result
这只能工作一次,但是我需要连续的数据。为此,我提出了一个使用装饰器的想法,该装饰器包装了此函数并对其应用了循环。
runningUserSids = set()
def emitLoop(emitString: str,frequency=0.5):
def checkForExitStatus(function):
@functools.wraps(function)
def wrapper(*args,**kwargs):
sid = request.sid
# already running for this user,don't run again
if sid in runningUserSids:
return
print("Running new thread")
#add to sid list
runningUserSids.add(sid)
# make sure data is recieved using a simple callback
got = False
def callbackGot():
nonlocal got
got = True
# sid will be removed from the set when user disconnects
while sid in runningUserSids:
got = False
output = function(*args,**kwargs)
socketio.emit(emitString,output,callback=callbackGot)
eventlet.sleep(frequency)
try:
# timeout incase user disconnects
# sid is removed from set and loop is exited
with eventlet.Timeout(5):
while not got:
eventlet.sleep(frequency)
except eventlet.timeout.Timeout:
print("timed out")
print("Stopped running thread")
return
return wrapper
return checkForExitStatus
# stop emitting when user disconnects
@socketio.on("disconnect")
def disconnected_stop_jobs():
runningUserSids.discard(request.sid)
将此装饰器应用于函数将产生:
@socketio.on('get_info_test')
@emitLoop('info_test')
@login_required_ws
def get_info():
result = {"result": None,"data": None}
try:
result["data"] = get_test_data(session.get("user_id")) # get data for user
result["result"] = "success"
except:
result["result"] = "Unknown error while getting data"
finally:
return result
每0.5秒向用户emit
连续发送数据。
问题
这种方法感觉很hacky,设计欠佳。这还会导致烧瓶服务器变慢,并在一段时间后停止响应。我想知道如何改进此方法,以防万一,这是一个很好的指导,如果不是,请向我展示如何正确发送emit
这样,同时还要确保客户端正在接收数据。
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。