【问题标题】:Django celery task executionDjango celery 任务执行
【发布时间】:2014-11-05 11:18:49
【问题描述】:

当恶魔只执行一项任务时,我在 tasks.py 文件中有 3 个任务。其余两个显示在调试模式但不执行。

celery worker --concurrency=1

有什么改变需要吗?

编辑:

@celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=1))
def task1():
    try:
        sc = SampleCount.objects.get(pk=1)
    except:
        sc = SampleCount()
    sc.num = sc.num + 1
    sc.save()
    return(sc)

相同的 task2 用于将数据添加到 SampleCount2(minute=2)task3 用于将数据添加到 SampleCount3(minute=3)。 现在我运行

python manage.py celeryd -E -B --loglevel=DEBUG

所以它会显示 3 个任务。但是当我检查状态时,它只显示 1 task1 active 。计划中没有其他两个。如果我运行

python manage.py celeryd -E -B --loglevel=DEBUG

再次命令,然后 task3 处于活动状态,其余两个不工作。如何使用一个工作人员运行三个任务。

我已经等到 10 分钟,但只有一个任务在工作(可能是它的 task1task2task3)。

【问题讨论】:

  • 1. python manage.py celeryd -E -B --loglevel=DEBUG 不会显示任务,它只能显示有关工人的信息。 2.你用什么broker? 3.如何查看任务状态? 4. 您是否尝试在您的任务中插入print 语句并观看celeryd 控制台输出?

标签: django celery-task


【解决方案1】:

这取决于服务器上可用的资源。

没有这样的要求,即任务数必须等于工人数。唯一需要了解的是:

运行的工作人员越多,处理所有任务的速度就越快,但需要更多的服务器资源

这个命令:

celery worker --concurrency=1

将产生两个进程

1. Control process, that will manage workers
2. worker process, the one, that will actually do the job

还有这个命令:

celery worker --concurrency=2

将产生三个进程

1. Control process, that will manage workers
2. worker process #1, the one, that will actually do the job
2. worker process #2, the one, that will actually do the job

等等。

一个工人可以处理你所有的任务,但两个工人会做得更快。

【讨论】:

  • 感谢您的回复。我已经使用下面的代码进行了检查。从 celery.task.control 导入检查。上面的命令 i.active() 向我发送了一项处于活动状态的任务,当我检查 i.sheduled() 时,它向我发送了空任务。在调试模式下,我检查了它的显示 3 任务,但只执行了一个。再次感谢您的宝贵回复。
  • @user3752103 1 个工作人员当前只能执行 1 个任务,即如果我正确理解问题,一个工作人员将一个接一个地处理任务,而不是并行处理。
  • 我在不同的时间安排了三个任务。但是当我签入调试时,只有一项任务正在工作。假设我有task1、task2、task3。当停止并重新启动后,它只运行 task1 而没有安排其他任务。我第二次在停止后开始,它将 task3 设为活动状态,没有其他计划结束,依此类推.. 再次感谢您尽快回复,因为我现在正在生产。
  • @user3752103 目前还不清楚这个问题。展示,您如何安排任务,并提供任务的简化代码。
  • 我用简化编辑了代码。需要你的帮助。再次感谢