我有一个沉重的外部库类,需要时间来初始化并消耗大量内存。我想为每个任务实例创建一次,至少。
class NlpTask(Task):
def __init__(self):
print('initializing NLP parser')
self._parser = nlplib.Parser()
print('done initializing NLP parser')
@property
def parser(self):
return self._parser
@celery.task(base=NlpTask)
def my_task(arg):
x = my_task.parser.process(arg)
# etc.
Celery启动32个工作进程,所以我希望打印"initializing ... done"
32次,因为我假设每个工作者都创建了一个任务实例。令人惊讶的是,我一次打印。那里到底发生了什么?谢谢。
答案 0 :(得分:1)
您的E1
在向工作人员注册时正在初始化。
如果你有两个任务,比如
NlpTask
然后当你启动一个工人时,你会看到2个初始化。
如果您想为每个工作人员初始化一次,您可以使用worker_process_init信号。
@celery.task(base=NlpTask)
def foo(arg):
pass
@celery.task(base=NlpTask)
def bar(arg):
pass
现在,当你启动一个worker时,你会看到每个进程调用一次setup。
答案 1 :(得分:1)
为此:
这就是我的意思-我希望每个工人一次,似乎每个芹菜实例一次。我编辑了问题– @davka
答案必须使用connect
中的发件人过滤器,例如:
@worker_process_init.connect(sender='xx')
def func(sender, **kwargs):
if sender == 'xx':
# dosomething
但是我发现它在celery 4.0.2中不起作用。