我需要一个无限循环来运行服务器端并在每次迭代中发出一些信息。
[此外,我需要确保它仅启动一次-最好是在服务器启动时启动-并且不会因使用该应用程序的各种用户而引起。
然后,如果可能,我想避免其他堆栈(线程,后台作业等)。
这是任务:
@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')
我还能怎么做?
thread = threading.Thread(target=refresh_games_list_periodically)
thread.start()
我猜...我想这不是一个好主意,您最好在一个进程中运行套接字循环,然后分别运行flask应用程序