【问题标题】:Flask-SocketIO:后台任务在重新加载模式下启动两次
【发布时间】:2022-01-23 11:05:27
【问题描述】:

我正在尝试通过 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

【问题讨论】:

    标签: python-3.x socket.io flask-socketio eventlet


    【解决方案1】:

    在看到manypeoplehaving遇到同样的问题并阅读Flask-SocketIO作者的this后:

    reloader 似乎不能很好地与 eventlet 配合使用

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

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

    并使用entr 检测文件更改:

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

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多