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
- 工人是干什么的
- 每个文件的任务(在同一组中)必须在单独的辅助进程上运行吗
换句话说,您知道设置是什么(假设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它帮助你解决问题了吗?