我有一个Flask应用程序,它使用SocketIO与当前在线用户进行通信。我通过将用户ID映射到会话ID来跟踪它们,然后我可以使用它来与它们进行通信:
online_users = {'uid...':'sessionid...'}
我在启动应用程序的run.py
文件中进行delcare,然后在需要时导入它:
from app import online_users
我使用Celery和RabbitMQ进行任务部署,我需要在任务中使用此dict。所以我按上面的方式导入它,但是当我使用它时,即使我知道它已填充,它也是空的。我在阅读this之后意识到这是因为每个任务都是异步的并且启动了一个带有空字典的新进程,所以我最好的办法是使用某种数据库或缓存。
我宁愿不再运行其他服务,我只需要阅读dict(我不会从任务中写入它)。缓存/数据库是我唯一的选择吗?
答案 0 :(得分:0)
这取决于你在dict中的内容....如果它是你可以序列化为字符串的东西你可以将它序列化为Json并将其作为参数传递给该任务。如果它是一个无法序列化的对象,那么是的,您需要使用缓存/数据库。
答案 1 :(得分:0)
我遇到了this discussion这似乎是我正在尝试做的解决方案。
通过消息队列的通信现在通过使用Kombu在包python-socketio中实现,Kombu提供了一个通用的API来处理包括Redis和RabbitMQ在内的多个消息队列。
据说官方发布很快就会发布,但截至目前,可以使用additional package完成。