所有任务的Python Celery单基类实例

时间:2017-03-31 06:10:08

标签: python celery

我有一个包含Task子类的tasks.py。 根据{{​​3}},每个任务只对基类进行一次实例化。

但这仅适用于相同的任务方法。调用其他任务会创建一个新实例。因此,我无法通过get_sessions创建的create_session访问会话。我怎么可能只有一个在不同任务之间共享的实例?

class AuthentificationTask(Task):
    connections = {}

    def login(self, user, password, server):

    if not user in self.connections:
        self.connections = {user: ServerConnection(verbose=True)}
    # from celery.contrib import rdb
    # rdb.set_trace()

    self.connections[user].login(user=user, password=password, server=server)


@task(bind=True, max_retries=1, queue='test', base=AuthentificationTask)
def create_session(self, user, password, server):
    self.login(user, password, server)


@task(bind=True, max_retries=1, queue='test', base=AuthentificationTask)
def get_sessions(self, user, password, server):
    return self.connections[user].sessions

3 个答案:

答案 0 :(得分:1)

为您的Celery应用程序设置task_cls arg,如下所示:

class AuthentificationTask(Task):

    def example(self):
        logger.info('AuthentificationTask.example() method was called')


@celery.task(bind=True)
def test_my_task(self):
    # call AuthentificationTask.example
    self.example()

app = celery.Celery(
   __name__,
   broker='redis://localhost:6379/0',
   task_cls=AuthentificationTask,
   # other args
)

在这种情况下,默认情况下将使用您的自定义类作为所有任务。

答案 1 :(得分:0)

似乎这是我网站上每次重新初始化self.connections导致的问题。

self.connections = {user: ServerConnection(verbose=True)}

在进一步的测试中,base仅针对所有(不同的)任务实例化一次。感谢@Danila Ganchar建议另一种方法。我试试看!

答案 2 :(得分:0)

通过在connections上设置AuthentificationTask类变量,您已走上正轨。这使它可以作为类本身的属性(即AuthentificationTask.connections)。当您在登录方法中引用self.connections时,我相信Python正在寻找实例变量connections,而不是同名的类变量。对于所需的行为,请将self.connectionsloginget_sessions中)替换为AuthentificationTask.connections