我有一些代码可以使用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])
我已经在SO和socketio的论坛上看到了一些关于此的主题,这使我更加接近,但是我仍然缺少一些东西...