从猴子修补的gevent线程调用时,socketio.emit()不会传递给用户

时间:2018-09-06 15:14:11

标签: 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()

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的论坛上看到了一些关于此的主题,这使我更加接近,但是我仍然缺少一些东西...

0 个答案:

没有答案