使用Celery存储类实例化对象

时间:2017-05-31 13:46:19

标签: python celery celery-task

我是Celery&的新手。 Python并且对这两者都有粗略的了解。 我有多个Ubuntu服务器,它们都运行多个Celery工作程序(10 - 15)。 这些工作人员中的每一个都需要使用第三方库/ DLL执行某项任务。为此我们首先 需要实例化它们的类对象并将其存储(以某种方式存储在内存中)。 然后Celery工作者读取RMQ队列以执行使用上述类对象方法的某些任务。 目标是实例化第三方类对象(当celerty worker启动时)然后执行任务, 使用类实例方法。只是反复这样做。

我不想使用REDIS,因为它似乎需要太多的开销来存储这么少量的数据(类对象)。 我需要帮助来确定如何为每个worker存储这个实例化的类对象。如果工作者失败或崩溃,显然,我们再次实例化该类,这不是问题。任何特定代码示例的帮助都会有很大帮助。

为了提供更多类比,我的要求类似于每个工作者具有唯一的数据库连接,并且每次重复请求都使用相同的连接。 更新了一些写得不好的代码:

tasks.py

from celery import Celery, Task

#Declares the config file and this worker file
mycelery = Celery('tasks')
mycelery.config_from_object('celeryconfig2')

class IQ(Task):
        _db = None

        @property
        def db(self):
                if self._db is None:
                        print 'establish DB connection....'
                        self._db = Database.Connect()
                return self._db

@mycelery.task(base=IQ)
def indexIQ():
        print 'calling indexing.....'
        if index.db is None:
                print 'DB connection doesn't exist. Let's create one...'
        ....
        ....

        print 'continue indexing!'

main.py

from tasks import *
indexIQ.apply_async()
indexIQ.appply_async()
indexIQ.appply_async()
print 'end program'

预期输出

calling indexing.....
DB connection doesn't exist. Let's create one...
establish DB connection....
continue indexing!
calling indexing.....
continue indexing!
calling indexing.....
continue indexing!

不幸的是,我一直在获得前4行输出,这意味着每次执行任务时都会发生数据库连接。我究竟做错了什么? 感谢

0 个答案:

没有答案