Как выйти из ранее открытой функции, созданной из socketio.start_background_task(), при создании нового соединения

#python #flask #socket.io #flask-socketio

#python #flask #socket.io #flask-socketio

Вопрос:

Каждый раз, когда я обновляю страницу со стороны клиента, устанавливается новое соединение с сервером flask, и он запускает функцию ‘backgroundFunction ()’ без выхода из недавно открытой функции, и их число увеличивается по мере обновления страницы снова и снова.

 from flask import Flask
from flask_socketio import SocketIO, send, emit
import socket
from time import sleep
import datetime

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
app.config['DEBUG'] = True

socketio = SocketIO(app , cors_allowed_origins="*" , async_mode = None , logger = False , engineio_logger = False)


def backgroundFunction():

    while True:
        data = "I am Data"
        socketio.emit('data', data, broadcast=True)
        socketio.sleep(2)


@socketio.on('connect')
def socketcon():
    print('Client connected')
    socketio.start_background_task(backgroundFunction)


if __name__ == ("__main__"):
    socketio.run(app, port=5009)
 

Ответ №1:

Посмотрите на пример кода в репозитории Flask-SocketIO, чтобы узнать один из возможных способов реализации фонового задания, которое запускается при первом запуске события.

Код здесь. Вот соответствующий отрывок:

 thread = None
thread_lock = Lock()

def background_thread():
    """Example of how to send server generated events to clients."""
    count = 0
    while True:
        socketio.sleep(10)
        count  = 1
        socketio.emit('my_response',
                      {'data': 'Server generated event', 'count': count})

@socketio.event
def connect():
    global thread
    with thread_lock:
        if thread is None:
            thread = socketio.start_background_task(background_thread)