Python gevent socketio从线程发送消息

Python gevent socketio从线程发送消息,python,flask,socket.io,gevent,gevent-socketio,Python,Flask,Socket.io,Gevent,Gevent Socketio,我想使用gevent socketio从工作线程发送消息,并更新所有连接的客户端的作业状态 我试过这个: from flask import Flask, render_template from flask.ext.socketio import SocketIO, send, emit import threading import time app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = Sock

我想使用gevent socketio从工作线程发送消息,并更新所有连接的客户端的作业状态

我试过这个:

from flask import Flask, render_template
from flask.ext.socketio import SocketIO, send, emit
import threading
import time

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@socketio.on('message')
def handle_message(message):
    send(message, broadcast=True)

@app.route('/')
def index():
    return render_template('index.html')

def ping_thread():
    while True:
        time.sleep(1)
        print 'Pinging'
        send('ping')

if __name__ == '__main__':
    t = threading.Thread(target=ping_thread)
    t.daemon = True
    t.start()
    socketio.run(app)
这给了我一个错误:

RuntimeError: working outside of request context
如何从没有
@socketio.on()
装饰器的函数发送消息?我可以直接使用
gevent
socketio
发送消息吗?

来自:

有时,服务器需要是消息的发起人。这对于向客户端发送源自服务器的事件通知非常有用。socketio.send()和socketio.emit()方法可用于向所有连接的客户端广播:


emit
不是来自flask.ext.socketio导入socketio,send,而是从
socketio=socketio(app)
调用您的
socketio
变量。如果您完成了
socketio\u connection=socketio(app)
,那么您将调用
socketio\u connection.emit()
来广播您的数据。

我实际上在文档中没有看到该部分(哦!)。但这正是我试图做的(见上面的代码),对我来说似乎不起作用。你正在调用
emit
,但链接上说要调用
socketio.emit
,谢谢你的反馈,@Celeo。我已经更新了我的帖子以包含更多的代码。如您所见,我直接导入
emit
send
,而不是
socketio
,所以这不是我的问题。
def some_function():
    socketio.emit('some event', {'data': 42})