在使用 flask-SocketIO 和 eventlet 时遇到问题
Having trouble with flask-SocketIO and eventlet
我正在开发我的最终学位项目,我在 Python、Flask、socketIO 和后台线程方面遇到了一些问题。
我的解决方案将一些文件作为输入,对其进行处理,进行一些计算,然后生成图像和 CSV 文件。然后将这些文件上传到某些存储服务。我想在后台线程上处理文件并使用 websockets 通知我的客户(web、Android 和 iOS)。现在,我正在使用 flask-socketIO
和 eventlet
作为我套接字的 async_mode
。当客户端上传文件时,该进程在后台线程中启动(使用 socketio.start_background_task
)但是那个繁重的进程(大约需要 30 分钟才能结束)似乎控制了主线程,结果当我尝试向服务器发出 HTTP 请求,响应正在无限加载。
我想知道是否有办法使用 eventlet 或其他不同的方法来完成这项工作。
提前致谢。
Eventlet 使用协作式多任务处理,这意味着您不能长时间使用 CPU 执行任务,因为这会阻止其他任务 运行ning。
一般来说,在 eventlet 进程中包含 CPU 繁重的任务是一个坏主意,因此一种可能的解决方案是将 CPU 繁重的工作卸载到外部进程,可能是通过 Celery或请求请求。另一个有时有效(但并非总是有效)的选项是尽可能频繁地在 CPU 繁重的任务中添加对 socketio.sleep(0)
的调用。 sleep 调用会暂时中断函数并允许其他函数等待 CPU 到 运行。
我正在开发我的最终学位项目,我在 Python、Flask、socketIO 和后台线程方面遇到了一些问题。
我的解决方案将一些文件作为输入,对其进行处理,进行一些计算,然后生成图像和 CSV 文件。然后将这些文件上传到某些存储服务。我想在后台线程上处理文件并使用 websockets 通知我的客户(web、Android 和 iOS)。现在,我正在使用 flask-socketIO
和 eventlet
作为我套接字的 async_mode
。当客户端上传文件时,该进程在后台线程中启动(使用 socketio.start_background_task
)但是那个繁重的进程(大约需要 30 分钟才能结束)似乎控制了主线程,结果当我尝试向服务器发出 HTTP 请求,响应正在无限加载。
我想知道是否有办法使用 eventlet 或其他不同的方法来完成这项工作。
提前致谢。
Eventlet 使用协作式多任务处理,这意味着您不能长时间使用 CPU 执行任务,因为这会阻止其他任务 运行ning。
一般来说,在 eventlet 进程中包含 CPU 繁重的任务是一个坏主意,因此一种可能的解决方案是将 CPU 繁重的工作卸载到外部进程,可能是通过 Celery或请求请求。另一个有时有效(但并非总是有效)的选项是尽可能频繁地在 CPU 繁重的任务中添加对 socketio.sleep(0)
的调用。 sleep 调用会暂时中断函数并允许其他函数等待 CPU 到 运行。