gpt4 book ai didi

python - 使用 Celery 和 Redis 链接或连接非常大的工作组/任务

转载 作者:可可西里 更新时间:2023-11-01 11:38:31 30 4
gpt4 key购买 nike

我正在开展一个项目,将一些繁重的模拟作业并行化。每次运行大约需要两分钟,占用 100% 的可用 CPU 能力,并生成超过 100 MB 的数据。为了执行下一步的模拟,需要将这些结果组合成一个巨大的结果。

请注意,这将在高性能系统上运行(目前在具有 16 GB 内存和 12 核的机器上进行测试,但可能会升级到更大的硬件)

我可以使用 celery 作业组轻松分派(dispatch)大约 10 个这样的作业,然后将其链接到串联步骤和下一个模拟中。 (本质上是 celery 和弦)但是,我需要能够在这台机器上运行至少 20 个,最终在更强大的机器上运行 40 个。似乎 Redis 不允许结果后端有足够大的对象让我做任何超过 13 个的事情。我找不到任何方法来改变这种行为。

我目前正在执行以下操作,并且效果很好:

test_a_group = celery.group(test_a(x) for x in ['foo', 'bar'])

test_a_result = rev_group.apply_async(add_to_parent=False)

return = test_b(test_a_result.get())

我想做的事:

return chord(test_a_group, test_b())

第二个适用于小型数据集,但不适用于大型数据集。它给了我一个非冗长的“Celery ChordError 104:连接被拒绝”的大数据。

测试 B 返回非常小的数据,本质上是通过失败,我只是将组结果传递给 B,所以它应该可以工作,除了我认为整个组被附加到 B 的结果,以 parent 的形式,使其太大。我找不到如何防止这种情况发生。

第一个效果很好,我会没事的,除了它提示说:

[2015-01-04 11:46:58,841: WARNING/Worker-6] /home/cmaclachlan/uriel-venv/local/lib/python2.7/site-packages/celery/result.py:45:

RuntimeWarning: Never call result.get() within a task!See http://docs.celeryq.org/en/latest/userguide/tasks.html#task-synchronous-subtasks

In Celery 3.2 this will result in an exception beingraised instead of just being a warning.

warnings.warn(RuntimeWarning(E_WOULDBLOCK))

链接本质上暗示的是我想做但不能做的事情。

我想我在某处读到 Redis 对推送给它的数据大小有 500 MB 的限制。

对这个最棘手的问题有什么建议吗?

最佳答案

Celery 并不是为了直接解决这个问题而设计的。一般来说,您希望保持任务的输入/输出较小。

每个输入或输出都必须序列化(默认情况下为 pickle)并通过代理传输,例如 RabbitMQ 或 Redis。由于代理需要在没有可用客户端处理消息时对消息进行排队,因此您最终可能会付出将数据写入/读取磁盘的代价(至少对于 RabbitMQ 而言)。

通常,人们将大量数据存储在 celery 之外,并通过 URI、ID 或其他唯一的方式在任务中访问它。常见的解决方案是使用共享网络文件系统(如前所述)、数据库、内存缓存或 S3 等云存储。

绝对不应该在任务中调用 .get(),因为它会导致死锁。

关于python - 使用 Celery 和 Redis 链接或连接非常大的工作组/任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769815/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com