Python 当从修补过的monkey gevent线程调用socketio.emit()时,不会将其发送给用户
我有一些代码,可以通过Python 当从修补过的monkey gevent线程调用socketio.emit()时,不会将其发送给用户,python,flask-socketio,Python,Flask Socketio,我有一些代码,可以通过socketio.emit()向连接的用户发送消息,但是当从gevent线程执行相同的操作时,数据永远不会发送到客户端 示例代码: from flask import Flask, request, render_template from flask_socketio import SocketIO, join_room, leave_room, emit import gevent from gevent import monkey monkey.patch_all()
socketio.emit()
向连接的用户发送消息,但是当从gevent线程执行相同的操作时,数据永远不会发送到客户端
示例代码:
from flask import Flask, request, render_template
from flask_socketio import SocketIO, join_room, leave_room, emit
import gevent
from gevent import monkey
monkey.patch_all()
app = Flask(__name__)
app.config['SECRET_KEY'] = '<redacted>'
app.debug = False
socket = SocketIO(app, async_mode="gevent")
def sendStamina(sessionId, stamina):
# have to use socket.emit here, simply because this function is called from an BG thread.
with app.test_request_context('/'):
socket.emit('stamina', {'sessiondId': sessionId, 'stamina': stamina}, room=sessionId)
print("sent satmina update")
def stamina_update():
print("stamina update called")
next_call = time.time()
while 1:
print("stamina update called inside")
next_call = next_call + 1
gevent.sleep(next_call - time.time())
sendStamina(<data>, <data>)
t1 = gevent.spawn(game.stamina_update)
t2 = gevent.spawn(start_server)
gevent.joinall([t1, t2])
从烧瓶导入烧瓶,请求,呈现\u模板
从flask_socketio导入socketio,加入房间,离开房间,发射
导入gevent
从gevent导入猴子
猴子
app=烧瓶(名称)
app.config['SECRET_KEY']=''
app.debug=False
socket=SocketIO(应用程序,async_mode=“gevent”)
def发送耐力(sessionId,耐力):
#必须在此处使用socket.emit,因为此函数是从BG线程调用的。
使用app.test_request_上下文('/'):
emit('stamina',{'sessiondId':sessionId,'stamina':stamina},room=sessionId)
打印(“已发送satmina更新”)
def耐力_更新():
打印(“称为耐力更新”)
下一次调用=time.time()
而1:
打印(“内部称为耐力更新”)
下一次呼叫=下一次呼叫+1
gevent.sleep(下一次调用-time.time())
耐力(,)
t1=gevent.spawn(游戏耐力更新)
t2=gevent.spawn(启动服务器)
gevent.joinall([t1,t2])
我在SO和socketio的论坛上看到了一些关于这方面的帖子,这让我更接近了,但我仍然缺少一些东西…有些重要的东西您没有包含在示例代码中。
start\u server
功能,如何连接客户端和客户端事件处理程序以处理“stamina”事件。在启用详细日志记录和显示工作和非工作发射的日志片段的情况下运行服务器也有助于解决这一问题。从主线程start\u server()
线程调用stamina\u update()。从任何其他线程调用stamina\u update()。另外,我将更新上面的代码以提供更多细节。