以设定的时间间隔从 flask_socketio 服务器发出事件

Posted

技术标签:

【中文标题】以设定的时间间隔从 flask_socketio 服务器发出事件【英文标题】:Emit events from flask_socketio server on set intervals 【发布时间】:2020-09-02 13:02:33 【问题描述】:

我有一个 React 客户端,它需要使用 flask_socketio 服务器发出的消息,如果我在 'connect' 上发出一条消息,它可以正常工作,但是如果我在一段时间内继续发出它循环它不会在客户端被拾取。我认为这可能是由于在活动线程中执行的操作。我在网上找不到任何谈论这个问题的帖子。

下面是我的 React js 客户端代码。

class MyClient extends Component 

    constructor() 
        super();
        this.state = 
            endpoint:"http://127.0.0.1:5000",
            response: ""
        ;
    


    componentDidMount() 
        console.log("test")
        const endpoint = this.state;
        //Very simply connect to the socket
        const socket = socketIOClient(endpoint);
        //Listen for data
        socket.on("connect", dd => 

            socket.on("log", dx => this.setState(response: dx.data));

          );

    


    render() 

        const response = this.state;

        return (
            <div>
            <h1>Test response</h1>
            console.log(response)>
        </div>

        )
    




客户端寻找从服务器发出的"log",现在我增加了时间来模拟变化的数据。 当客户端加载时,我会看到数据,当我断开并重新连接服务器时,我会看到客户端上的新数据。我想知道如何连续发出数据

from flask import Flask, render_template, request, jsonify
from flask_socketio import SocketIO, emit
from flask_cors import CORS
from datetime import datetime
import time

now = datetime.now()

current_time = now.strftime("%H:%M:%S")


app = Flask(__name__)
app.config['SECRET_KEY'] = 'justasecretkeythatishouldputhere'

socketio = SocketIO(app,cors_allowed_origins="*")
CORS(app)


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


@app.route('/api')
def api():
    query = dict(request.args)
    socketio.emit('log', dict(data=str(query)), broadcast=True)
    return jsonify(dict(success=True, message='Received'))


@socketio.on('connect')
def on_connect():
    time.sleep(1)
    t = str(time.clock())
    print(t)
    socketio.emit('log', 'data': t, 'time': t)


if __name__ == '__main__':
    socketio.run(app,port=5000)

下面的循环不起作用,我应该将它作为后台线程运行还是需要添加到 socketio 的异步属性。非常感谢任何帮助。

@socketio.on('connect')
def on_connect():
    while True:
        time.sleep(1)
        t = str(time.clock())
        print(t)
        socketio.emit('log', 'data': t, 'time': t)

【问题讨论】:

我认为,那个循环,你需要在客户端使用,而不是在服务器端。 需要CORS(app) 吗? 【参考方案1】:

在您的客户端,您可以使用setInterval 方法每隔几毫秒发出一个事件。

在服务器端,您可以发出可以发送数据的事件。

所以,总的来说,它会像下面这样:

客户端:

setInterval(function() 
    socket.emit('time');
, 1) // 1 millisecond is almost close to continues

socket.on('time', function(data) 
    console.log(data)
);

服务器端:

@socket.on('time')
def time():
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")
    emit('time', current_time)

在浏览器的控制台日志中,您可以看到继续记录的数据。

我希望这会有所帮助。

注意:我在此处提供的客户端代码是纯 javascript。由于 React 是基于 JavaScript 的,所以会有一些或其他的方式来使用setInterval

【讨论】:

谢谢,它可以工作,但是我在服务器端的有效负载异常中收到了太多数据包,使用此帖子修复它github.com/miguelgrinberg/python-engineio/issues/142 幸运的是,我没有收到此错误。你能详细说明一下吗,这样下次当我遇到类似的事情时,我会小心的。 这只是一种方法。我知道有很多。如果您可以在这里发布更好的答案或提出可以改进的地方,每个人都会学习的伙伴。 我发现这个答案很有用,但发现当 setinterval at 1 附加到绘制渲染图形时,我的 CPU 使用率飙升。是否应该注意不要草率地使用连续 setinterval(1 毫秒),而是建议寻找具有更长间隔的其他事件?

以上是关于以设定的时间间隔从 flask_socketio 服务器发出事件的主要内容,如果未能解决你的问题,请参考以下文章

根据购物车的状态以设定的时间间隔推送通知? /离子

csharp 一个控制台应用程序,以设定的间隔执行代码

AS3如何获取URLRequest以设定的间隔重复操作

如何使用不断递增的整数检测设定间隔的通过

Flask_socketIO 不与第二个客户端通信

如何使用 ssl 启动 flask_socketio 应用程序?