如何在不使用线程/后台作业的情况下同时使服务器端循环无休止且无阻塞?

问题描述 投票:0回答:1

我需要一个无限循环来运行服务器端并在每次迭代中发出一些信息。

[此外,我需要确保它仅启动一次-最好是在服务器启动时启动-并且不会因使用该应用程序的各种用户而引起。

然后,如果可能,我想避免其他堆栈(线程,后台作业等)。

这是任务:

@app.route('/refresh_games_list_periodically')
def refresh_games_list_periodically():
    while True:
        response = {
            'games_list': games_manager.get_nonexpired_games(),
        }
        socketio.emit('games_list_refreshed', response)
        time.sleep(1)

它在呈现“ index.html”时开始:

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

index.html:

fetch("{{url_for('refresh_games_list_periodically') }}")

完整代码:

import time

from flask import (
    Flask, 
    render_template, 
    jsonify,
    request,
)
from flask_socketio import SocketIO, emit

from minesweeper import Game, GamesManager

games_manager = GamesManager()

app = Flask(__name__)
socketio = SocketIO(app)

@app.route('/refresh_games_list_periodically')
def refresh_games_list_periodically():
    while True:
        response = {
            'games_list': games_manager.get_nonexpired_games(),
        }
        socketio.emit('games_list_refreshed', response)
        time.sleep(1)

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

当前的问题是,每当新用户输入'index.html'时,除旧循环外,循环的另一次迭代将开始运行。

我尝试使用一些布尔标志将视图标记为已被调用,但是在Flask上下文中无法正确显示它。

然后,我以为我可以将refresh_games_list_periodically设为普通功能,而不是视图,只需在我的Flask应用中将其命名即可。但是,然后while循环将被阻塞,并且不会呈现任何页面:

import time

from flask import (
    Flask, 
    render_template, 
    jsonify,
    request,
)
from flask_socketio import SocketIO, emit

from minesweeper import Game, GamesManager

games_manager = GamesManager()

app = Flask(__name__)
socketio = SocketIO(app)

refresh_games_list_periodically()

def refresh_games_list_periodically():
    while True: # WILL BLOCK
        response = {
            'games_list': games_manager.get_nonexpired_games(),
        }
        socketio.emit('games_list_refreshed', response)
        time.sleep(1)

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

我还能怎么做?

python flask flask-socketio
1个回答
0
投票
thread = threading.Thread(target=refresh_games_list_periodically)
thread.start() 

我猜...我想这不是一个好主意,您最好在一个进程中运行套接字循环,然后分别运行flask应用程序

© www.soinside.com 2019 - 2024. All rights reserved.