Python 芹菜正确的任务组链

Python 芹菜正确的任务组链,python,python-3.x,celery,Python,Python 3.x,Celery,我有一个字符串列表,它们是文件名: chunks_list = [["file_1", "file_2"], ["file_3", "file_4", "file_5"], ...] 我需要在芹菜任务中处理此文件,因此我有一个任务: @celery_app.task def process_file_task(filename): # do some staff with file

我有一个字符串列表,它们是文件名:

chunks_list = [["file_1", "file_2"], ["file_3", "file_4", "file_5"], ...]
我需要在芹菜任务中处理此文件,因此我有一个任务:

@celery_app.task
def process_file_task(filename):
    # do some staff with file 
    # (e.g. produce data to Kafka)
我需要并行运行内部文件列表。和外部列表应该是顺序的

处理方式应为:

worker1: file_1
worker2: file_2
第一组完成后,下一组开始:

worker1: file_3
worker2: file_4
worker3: file_5
我尝试以以下方式运行我的任务:

sequence_tasks = []
for chunks in chunks_list:
    sequence_tasks.append(
        group([process_file_task.si(filename) for filename in chunks])
    )

tasks_chain = chain(
    tasks_group for tasks_group in sequence_tasks
)()
tasks_chain.get()
问题是我可能有数千个文件。这种运行任务的方式消耗了我所有的空闲内存,即使只有几百个。
请告诉我如何以正确的方式设计我的工作流,以避免内存不足。

您没有提到设置详细信息:

  • 你们的工人在哪里?码头工人?(k8s/ecs/)ec2
  • 工人是干什么的
  • 每个文件的任务(在同一组中)必须在单独的辅助进程上运行吗
你有多少工人总是有上限的。 假设您有10个工作人员,每个工作人员在一个组中有1个并发任务和1000个任务。它们几乎是并行运行的(因为你没有1000个工人,只有10个),但这很好。芹菜将确保第二组的任务在完成前1000个任务之前不会启动。如果运行每个任务所需的时间相等,则每个工作人员将处理100个任务,然后将转到下一个块。如果所需时间不同,芹菜将通过将下一个任务分配给下一个自由工作者来优化


换句话说,您知道设置是什么(假设EC2实例具有16GB和8个内核)。您还知道(我希望)单个任务可以占用的最大内存大小。如果一个平均任务占用1GB内存,那么您最多可以运行16个并行任务1或6个并行任务2等)

我真的忘了提到我的设置。我们在k8s中运行它,其中worker pod的内存限制设置为5GB。当RAM使用率达到这一点时,它就被SIGKILL杀死了。然后我试着在本地监控它的行为。我有8个核心和8个工人。问题是,在调用
tasks\u chain.get()
之后,只有一个python进程开始消耗所有可用内存(最多16 GB)。在我看来,当我在for循环中生成任务组时,我似乎做错了什么。等等,
tasks\u chain.delay()
(在get之前)如何触发工作?每个任务的返回值是多少?也许要花很多时间。。(顺便问一下,你的芹菜后端是什么)
tasks\u chain.delay()
没有改变任何东西。一个进程甚至在开始任何任务之前都会占用所有可用内存。返回“无”中的任务值,它读取文件并向Kafka生成数据。我在broker和result Backend中都使用Redis,您可以尝试限制/减少您在那里构建的画布吗?(假设最大块大小为10,总块数为5)只是为了减轻problem@SagitKhaliullin它帮助你解决问题了吗?