【发布时间】:2019-09-20 16:03:40
【问题描述】:
我有两个 celery 任务,在两个不同的文件中实现。 Task1需要启动task2,所以task2是从task1导入的。
mypkg
| tasks
| task1.py
| task2.py
task1.py
from mypkg.tasks.task2 import task2
celery_app = Celery('mypkg.tasks.task1', broker='redis://localhost')
@celery_app.task
def task1():
print('Do task 1')
// Then call task2
task2.delay()
task2.py
celery_app = Celery('mypkg.tasks.task2', broker='redis://localhost')
@celery_app.task
def task2():
print('Do task 2')
当我使用以下命令启动 celery 时,两个任务都会运行,尽管我只期望 task1:
pipenv run celery -A mypkg.tasks.task1 worker --loglevel=info
这很可能是因为 task1 导入了 task2。如何告诉 celery 只运行 task1 中的任务?
【问题讨论】:
-
如果它们是不同应用程序的一部分,那么您的任务应该在完全不同的包中。如果它们确实属于同一个应用程序,则不要实例化 Celery 两次。工人选择这两个任务的原因可能是因为 mypkg.tasks 加载了 task1.py 和 task2.py 所以它们都被注册了。
-
是的,你是对的,我意识到我的最小示例并不准确。问题是因为 task1 导入了 task2,因此在启动 task1 时 task2 也会启动。
-
所以如果一个任务需要启动其他任务,而不是导入其他任务,我使用 celery
send_task方法将任务放入工作队列中。