使用flask-SocketIO 和eventlet 时遇到问题

问题描述

我正在开发我的最终学位项目,但我在 Python、Flask、socketIO 和后台线程方面遇到了一些问题。

我的解决方案将一些文件作为输入,处理它们,进行一些计算,然后生成一个图像和一个 CSV 文件。然后将这些文件上传到某个存储服务。我想在后台线程上处理文件并使用 websockets 通知我的客户端(Web、Android 和 iOS)。现在,我使用 flask-socketIOeventlet 作为我的套接字的 async_mode。当客户端上传文件时,该进程在后台线程中启动(使用 socketio.start_background_task)但是这个繁重的进程(大约需要 30 分钟才能结束)似乎控制了主线程,因此当我尝试向服务器发出 HTTP 请求,响应是无限加载的。

我想知道是否有办法使用 eventlet 或其他不同的方法来完成这项工作。

提前致谢。

解决方法

Eventlet 使用协作式多任务处理,这意味着您不能让任务长时间使用 CPU,因为这会阻止其他任务运行。

一般来说,在 eventlet 进程中包含 CPU 繁重的任务是一个坏主意,因此一种可能的解决方案是将 CPU 繁重的工作卸载到外部进程,也许通过 Celery 或 RQ。有时(但并非总是如此)的另一种选择是尽可能频繁地在 CPU 繁重的任务中添加对 socketio.sleep(0) 的调用。 sleep 调用会暂时中断该函数,并允许其他等待 CPU 运行的函数。