我深入研究了代码并尝试了很多东西。以下是我学到的。
如何执行自动发现
自动发现实际上由执行
app._autodiscover_tasks()
(
src
),由调用
celery.signals.import_modules
信号(
src
),由发送
app.loader.import_default_modules()
(
src
)。信号连接到
应用程序_autodiscover_tasks()
在里面
app.autodiscover_tasks
(
src
)。
换句话说,触发自动发现的唯一方法是:
-
呼叫
app.autodiscover_tasks()
注册
app._autodiscover_tasks
作为信号的接收器
celery.signals.import_modules
-
呼叫
app.loader.import_default_modules()
发送信号
医生指示我做第一个,但不做第二个。因此,在我的Django应用程序中,自动发现是不会发生的。
如何在中执行自动发现
celery
如果你跑步
芹菜
使用命令
beat
,
report
,
shell
或
worker
,生成的代码路径最终调用
app.loader.import_default_modules()
直接地因此,自动发现是在这些条件下发生的,但不是在运行Django应用程序、打开Django shell或除这四个命令之外的任何其他上下文时,除非您显式调用
app.loader.import_default_modules()
。
完成时
文档承诺访问
app.tasks
将导致应用程序最终确定,我认为这会触发自动发现,但与此无关。所有这些
finalize
做的是发送
app.on_after_finalize
信号,它什么也不做。
我的解决方案
在经历了许多令人沮丧和实验之后,我决定从我的
celery.py
:
app = Celery("myproj")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
@app.on_after_configure.connect()
def trigger_autodiscovery(sender, **kwargs):
app.loader.import_default_modules()