Flask SocketIO:后台任务在重载模式下启动两次



我试图使用flask socketio的后台任务,遇到了两个问题:

  1. 在重载模式下,后台任务启动两次
  2. 更改代码时,flask会重新加载,但后台任务不会被终止

我的代码:

from flask import Flask
from flask_socketio import SocketIO
import random
application = Flask(__name__)
socketio = SocketIO(application, async_mode='eventlet')
import eventlet
eventlet.monkey_patch()
def background_thread():
print('starting backgound task')
thread_id = random.randint(1,100)
while True:
print(f'background thread {thread_id}')
socketio.sleep(1)
if __name__ == '__main__':
print('--------------------')
socketio.start_background_task(background_thread)
socketio.run(application, debug=True, use_reloader=True)

输出:

python application.py
--------------------
starting backgound task
background thread 26
* Restarting with stat
--------------------
starting backgound task
background thread 59
background thread 26
* Detected change in '/Users/philipp/code/nifmap/application.py', reloading
background thread 26
background thread 59
background thread 26
background thread 59

当我点击^C时,一个后台任务被杀死,但另一个没有。只有当我执行debug=True时才会发生这种情况。如何启动后台任务,使其只启动一次,然后在重新加载时被杀死?

使用gevent时也会发生同样的情况,从async_mode='eventlet'开始执行:

from gevent import monkey
monkey.patch_all()

版本:

eventlet==0.33.0
Flask==2.0.2
Flask-SocketIO==5.1.1
Flask-WTF==0.15.1
greenlet==1.1.2
python-engineio==4.3.0
python-socketio==5.5.0
websocket-client==1.2.3
Werkzeug==2.0.2

Python 3.8.2

看到许多人遇到了同样的问题,并从Flask SocketIO:的作者那里读到了这篇文章

似乎重新加载程序与eventlet 玩得不好

我放弃了自动重新加载,而是在没有重新加载的情况下启动Flask

socketio.run(application, debug=True, use_reloader=True)

并使用entr检测文件更改:

ls *.py | entr -r python application.py

最新更新