我在一个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
的数据
这种方法感觉非常粗糙,设计也很糟糕。它还会导致flask服务器减速,并在一段时间后停止响应。我想知道如何改进此方法,以防它是一个好的方向,如果不是,请向我展示一个很好的示例,说明如何正确地发送这样的emit
,同时确保客户机正在接收数据
谢谢
目前没有回答
相关问题 更多 >
编程相关推荐