【发布时间】:2016-01-16 06:13:05
【问题描述】:
我有一个 Flask 应用程序,它使用 SocketIO 与当前在线的用户进行通信。我通过将用户 ID 映射到会话 ID 来跟踪他们,然后我可以使用该会话 ID 与他们通信:
online_users = {'uid...':'sessionid...'}
我在启动应用程序的run.py 文件中对此进行了删除,然后在需要时将其导入:
from app import online_users
我将 Celery 与 RabbitMQ 一起用于任务部署,我需要在任务中使用此 dict。所以我按上述方式导入它,但是当我使用它时,即使我知道它已填充,它也是空的。在阅读this 后,我意识到这是因为每个任务都是异步的,并且使用空字典启动一个新进程,所以我最好的选择是使用某种数据库或缓存。
我宁愿不运行额外的服务,我只需要从字典中读取(我不会从任务中写入它)。缓存/数据库是我唯一的选择吗?
【问题讨论】:
-
celery任务在不同进程中运行,启动后无法访问dict。 Redis 等中的缓存可能是您的最佳选择。
-
是否有可能让主应用进程监听任务进程发出的请求以在主进程中回调函数?
-
是的,这应该是可能的。你可以实现一个 Redis pubsub 来在两个进程之间发送/接收消息。
-
flask-socketio 的作者似乎最近在使用 kombu 的包中 implemented 正是这个。