【问题标题】:Celery consuming whole memory芹菜消耗整个内存
【发布时间】:2014-05-29 12:12:00
【问题描述】:

我有一个关于芹菜的问题。

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

我刚刚尝试了太多的任务数据,以至于它不适合我的记忆。 结果是 celery 被杀死,因为它使用了整个系统内存。

虽然消息不会写入磁盘(代理 rabbitmq)

CELERY_DEFAULT_DELIVERY_MODE = 'persistent'

已设置。

我的任务如下所示:

group(some_iterator).apply_async()

celery 会先尝试序列化整个数据(我用的是pickle),然后发送到任务队列吗?

如果我运行它,我可以看到任务写入磁盘的数据越少。

感谢您的帮助!

【问题讨论】:

  • 如果您要向 Celery 任务发送大量数据,最好将其存储在某个数据库中并仅发送给 Celery 任务,只发送 id 列表。当任务运行时,进行 SQL 查询检索必要的数据,处理并将结果保存回数据库。

标签: python celery


【解决方案1】:

我发现了实现这种行为的可能性:

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 中,该 ResultGroup 可用于检索组结果。

但我选择的解决方案是将数据存储在数据库中,让工作人员通过 id 获取它。

希望能帮助一些面临同样问题的人!

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多