Python 在芹菜任务中使用导入变量

Python 在芹菜任务中使用导入变量,python,flask,celery,Python,Flask,Celery,我有一个Flask应用程序,它使用SocketIO与当前在线的用户进行通信。我通过将用户ID映射到会话ID来跟踪他们,然后我可以使用会话ID与他们通信: online_users = {'uid...':'sessionid...'} 我会在启动应用程序的run.py文件中删除它,然后在需要时将其导入: from app import online_users 我将芹菜与RabbitMQ一起用于任务部署,我需要在任务中使用此dict。所以我如上所述导入它,但当我使用它时,它是空的,即使我知道

我有一个Flask应用程序,它使用SocketIO与当前在线的用户进行通信。我通过将用户ID映射到会话ID来跟踪他们,然后我可以使用会话ID与他们通信:

online_users = {'uid...':'sessionid...'}
我会在启动应用程序的
run.py
文件中删除它,然后在需要时将其导入:

from app import online_users
我将芹菜与RabbitMQ一起用于任务部署,我需要在任务中使用此dict。所以我如上所述导入它,但当我使用它时,它是空的,即使我知道它已填充。在阅读之后我意识到这是因为每个任务都是异步的,并且用一个空的dict启动一个新的进程,所以我最好的选择是使用某种数据库或缓存


我不希望运行额外的服务,我只需要读取dict(我不会从任务中写入)。缓存/数据库是我唯一的选择吗?

这取决于您在目录中的内容。。。。如果是可以序列化为字符串的内容,则可以将其序列化为Json,并将其作为参数传递给该任务。如果它是一个无法序列化的对象,那么是的,您需要使用缓存/数据库

这取决于你的口述。。。。如果是可以序列化为字符串的内容,则可以将其序列化为Json,并将其作为参数传递给该任务。如果它是一个无法序列化的对象,那么是的,您需要使用缓存/数据库

我遇到了这样一个问题,它似乎正好解决了我要做的事情

通过消息队列的通信现在通过使用Kombu在包python socketio中实现,Kombu提供了一个公共API来处理多个消息队列,包括Redis和RabbitMQ

据推测,官方版本很快就要发布了,但到目前为止,它可以使用一个。

来完成。我发现它似乎正是我想要做的事情的解决方案

通过消息队列的通信现在通过使用Kombu在包python socketio中实现,Kombu提供了一个公共API来处理多个消息队列,包括Redis和RabbitMQ


据推测,官方版本即将发布,但到目前为止,可以使用运行在不同进程中的芹菜任务来完成。芹菜任务启动后无法访问dict。在Redis或类似设备中的缓存可能是您的最佳选择。是否可以让主应用程序进程侦听任务进程发出的请求,以便在主进程中调用函数?是的,这应该是可能的。您可以实现一个Redis pubsub来在两个进程之间发送/接收消息。flask socketio的作者最近使用kombu在包中准确地描述了这一点。芹菜任务在另一个进程中运行,启动后无法访问dict。在Redis或类似设备中的缓存可能是您的最佳选择。是否可以让主应用程序进程侦听任务进程发出的请求,以便在主进程中调用函数?是的,这应该是可能的。您可以实现一个Redis pubsub来在两个进程之间发送/接收消息。flask socketio的作者最近使用kombu在包中提供了这一功能。它是可序列化的,但是需要实时读取,并且这些任务以倒计时的方式排队,以便在执行时数据会过时。我想我只需要通过缓存路由使用Redit就可以了。如果是这样的话,那么是的。您必须使用某种类型的缓存。它是可序列化的,但是需要实时读取,并且这些任务以倒计时方式排队,以便数据在执行时过时。我想我只需要通过缓存路由使用Redit就可以了。如果是这样的话,那么是的。你必须使用某种缓存。