gevent-socketio 从线程发送消息

Posted

技术标签:

【中文标题】gevent-socketio 从线程发送消息【英文标题】:gevent-socketio send message from thread 【发布时间】:2015-01-09 18:28:27 【问题描述】:

我想使用 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() 装饰器的函数发送消息?可以直接用geventsocketio发消息吗?

【问题讨论】:

【参考方案1】:

来自this section of the documentation:

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

def some_function():
    socketio.emit('some event', 'data': 42)

这个emit 不是来自from flask.ext.socketio import SocketIO, send,而是从socketio = SocketIO(app) 调用你的socketio 变量。如果您完成了socketio_connection = SocketIO(app),那么您将调用socketio_connection.emit() 来广播您的数据。

【讨论】:

我实际上没有在文档中看到该部分(d'oh!)。但这正是我试图做的(见我上面的代码),它似乎对我不起作用。 你打电话给emit,但链接说打电话给socketio.emit 感谢@Celeo 的反馈。我已经更新了我的帖子以包含更多我的代码。如您所见,我是直接导入emitsend,而不是socketio,所以这不是我的问题。

以上是关于gevent-socketio 从线程发送消息的主要内容,如果未能解决你的问题,请参考以下文章

mfc c++ 将带有 postmessage 的自定义用户消息从工作线程发送到主 ui 线程

大数据-消息队列-Kafka:Producer(生产者)发送消息采用的是异步发送两个线程:main线程和Sender线程线程共享变量:双端队列RecordAccumulator

SendNotifyMessage 不发送正确的消息

从 Service 向 Activity 发送简单消息

kafka生产者的发送消息的流程以及代码案例

Kafka快速入门(生产者)同步异步发送分区消息精确一次发送幂等性事务