我有一个包含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
答案 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.connections
(login
和get_sessions
中)替换为AuthentificationTask.connections
。