Celery占用全部内存

0 投票
1 回答
504 浏览
提问于 2025-04-18 07:56

我有一个关于Celery的问题。

我正在往任务队列发送大量数据。

我刚试了一下,数据量大到我的内存装不下。

结果是Celery被杀掉了,因为它占用了整个系统的内存。

尽管已经设置了

CELERY_DEFAULT_DELIVERY_MODE = 'persistent'

,消息还是没有写入磁盘(使用的消息代理是rabbitmq)。

我的任务看起来是这样的:

group(some_iterator).apply_async()

Celery是先尝试把所有数据序列化(我用的是pickle),然后再发送到任务队列吗?

如果我运行的数据量少一些,就能看到任务被写入磁盘。

谢谢你的帮助!

1 个回答

0

我找到了一种实现这个功能的方法:

result_group = GroupResult(results = [])
for task_args task_arg_generator:
    task = analyze_task.delay(*task_args)
    result_group.add(task)


result_group.get()
# or :
result_group.join_native()

这个方法会把每个任务单独处理并发送,然后把结果放在一个叫做ResultGroup的地方,这样就可以用来获取这些结果。

不过我选择的解决方案是把数据存储在数据库里,让工作者通过ID来获取数据。

希望这能帮助到一些遇到同样问题的人!

撰写回答