【问题标题】:How to run only selected tasks in celery如何在芹菜中只运行选定的任务
【发布时间】: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 方法将任务放入工作队列中。

标签: python celery


【解决方案1】:

如果这是您真正想要的,只需将您的实例放在不同的代理 URL 上,例如,

celery_app = Celery('mypkg.tasks.task1', broker='redis://localhost/1')

。 . .和 。 . .

celery_app = Celery('mypkg.tasks.task2', broker='redis://localhost/2')

虽然您可以这样做,但我建议改为 using routing and queues 指定哪些任务由哪些工作人员处理。路由是一个深入的话题,但是一旦你掌握了它,它就相当简单了。

【讨论】:

  • 我更新了我的问题,因为它缺少一些基本的东西,但是 +1 提到了路由和队列。
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2015-09-07
  • 1970-01-01
相关资源
最近更新 更多