flask_socket.io _ 运行异步任务的问题

Posted

技术标签:

【中文标题】flask_socket.io _ 运行异步任务的问题【英文标题】:flask_socket.io _ problem with running async tasks 【发布时间】:2021-03-29 23:50:58 【问题描述】:

我的烧瓶项目有这个配置:

在requrement.txt中:

flask_socketio
eventlet

在我的 app.py 中:

from flask_socketio import SocketIO
socketio = SocketIO(app, async_mode="eventlet")


@socketio.on('register')
async def register(data):

    await my_asyncfunction(data['machine_id'])

和 my_asyncfunction:

async def my_asyncfunction(data):
   ....

这是我的错误:

/usr/local/lib/python3.7/threading.py:870: Ru​​ntimeWarning: coroutine 'my_asyncfunction' 从未等待 self._target(*self._args, **self._kwargs)RuntimeWarning: E​​nable tracemalloc 获取对象分配回溯

所以我尝试了async_mode="eventlet" 选项但同样的错误:(

【问题讨论】:

【参考方案1】:

Flask、Flask-SocketIO 和 eventlet 都不支持 asyncio,你不能以这种方式混合使用常规函数和异步函数。

如果您的应用程序使用 asyncio 函数,那么您必须放弃 Flask、Flask-SocketIO 和 eventlet,而使用支持 asyncio 的 python-socketio。

【讨论】:

tnx 回复。所以这里的场景是。我有用于 HTTP 请求的烧瓶和用于处理微型微服务工作者的 socket-io 烧瓶。哪些工作人员连接到我的后端。在工作人员和服务器之间建立连接后。 worker 发送机器 ID(mac 地址)以在云中注册(Kubernetes 中的 Pod)。因此必须等待此注册,并且需要向该工作人员发出响应。那么我应该如何处理这个问题呢? 有关如何将 Socket.IO 与 Flask 一起使用的示例,请参阅 Flask-SocketIO 文档。正如我在回答中所说,您不能在 Flask 应用程序中使用 asyncio。

以上是关于flask_socket.io _ 运行异步任务的问题的主要内容,如果未能解决你的问题,请参考以下文章

将异步协程作为 celery 任务运行

使用异步任务降低API延迟_实践总结

(82)Wangdao.com第十六天1017__ JavaScript 异步操作

13_CompletableFuture异步回调

13_CompletableFuture异步回调

flask celery 的神坑