在芹菜中排队任务的时间瓶颈我的应用程序 - 如何并行化.delay()?

时间:2014-10-15 23:00:51

标签: python parallel-processing rabbitmq celery django-celery

我的celery + rabbitmq应用程序遇到了一个主要问题,排队工作的时间比我的工作人员完成工作的时间要长。无论我旋转多少台机器,我的排队时间总是会超过我的任务时间。

这是因为我在一台机器上有一个celery_client脚本,它按顺序执行所有排队(调用task.delay())。我正在迭代存储在S3中的文件列表。如何并行排队过程?我想这是一个普遍的基本问题,但我找不到解决方案。

编辑:澄清一下,我在for循环中调用task.delay(),它循环遍历S3文件列表(其中有大量的小文件)。我需要将结果返回给我,以便将其返回给客户端,因此我在上面的内容之后迭代结果列表以查看结果是否完成 - 如果是,我将其附加到结果文件。

我能想到的一些解决方案是我的for循环中的某种多线程支持,但我不确定.delay()是否可以使用它。这个问题没有内置的芹菜支持吗?

EDIT2更多细节:我在celeryconfig中使用了一个队列 - 我的任务都是一样的。

EDIT3:我遇到了“分块”,你可以把很多小任务分成一个大任务。不确定这是否可以解决我的问题,因为虽然我可以将大量小任务转换为少量大任务,但我的for循环仍然是顺序的。我在文档中找不到太多信息。

1 个答案:

答案 0 :(得分:0)

如果排队任务的时间比任务长,那么如何增加任务范围,以便它们一次对N个文件进行操作。因此,不是为1000个文件排队1000个任务。您排队10个一次操作100个文件的任务。

让您的任务获取文件列表,而不是输入文件。然后,当您遍历文件列表时,您可以在时间循环100。