问题描述
背景信息
我正在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 (将#修改为@)