我是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行输出,这意味着每次执行任务时都会发生数据库连接。我究竟做错了什么? 感谢