flask-SocketIO 和 eventlet 有问题
Posted
技术标签:
【中文标题】flask-SocketIO 和 eventlet 有问题【英文标题】:Having trouble with flask-SocketIO and eventlet 【发布时间】:2021-07-24 17:41:25 【问题描述】:我正在开发我的期末学位项目,我在 Python、Flask、socketIO 和后台线程方面遇到了一些问题。
我的解决方案将一些文件作为输入,处理它们,进行一些计算,然后生成图像和 CSV 文件。然后将这些文件上传到某个存储服务。我想在后台线程上处理文件并使用 websockets 通知我的客户端(Web、android 和 ios)。现在,我使用flask-socketIO
和eventlet
作为我的套接字的async_mode
。当客户端上传文件时,该进程在后台线程中启动(使用socketio.start_background_task
)但繁重的进程(大约需要 30 分钟才能结束)似乎控制了主线程,因此当我尝试制作时对服务器的 HTTP 请求,响应正在无限加载。
我想知道是否有办法使用 eventlet 或使用其他不同的方法来完成这项工作。
提前谢谢你。
【问题讨论】:
看看这个:blog.miguelgrinberg.com/post/using-celery-with-flask 【参考方案1】:Eventlet 使用协作多任务,这意味着您不能让一个任务长时间使用 CPU,因为这会阻止其他任务运行。
一般来说,在 eventlet 进程中包含 CPU 繁重的任务是一个坏主意,因此一种可能的解决方案是将 CPU 繁重的工作卸载到外部进程,可能通过 Celery 或 RQ。有时有效(但并非总是)的另一个选项是在 CPU 繁重任务中尽可能频繁地添加对 socketio.sleep(0)
的调用。 sleep 调用会中断该函数片刻,并允许其他函数等待 CPU 运行。
【讨论】:
以上是关于flask-SocketIO 和 eventlet 有问题的主要内容,如果未能解决你的问题,请参考以下文章
我无法安装 eventlet/gevent/greenlet
尽管使用了 socketio.run(),但“Flask-SocketIO 正在 Werkzeug 下运行”