【问题标题】:Share objects between celery tasks在 celery 任务之间共享对象
【发布时间】:2015-08-04 08:58:26
【问题描述】:

我有一个程序可以处理大约 500 000 个文件 {Ai} 并且对于每个文件,它都会获取一个定义 {Di} 用于解析。

现在,每个文件 {Ai} 都由一个专用的 celery 任务解析,并且每次定义文件 {Di} 都被再次解析以生成一个对象。该对象用于解析文件 {Ai}(JSON 表示)。

我想存储定义文件(生成的对象){Di(object)} 以使其可用于整个任务。

所以我想知道管理它的最佳选择是什么:

  1. Memcahe + Python-memcached,
  2. 一个长时间运行的任务,使用 set(add)/get 接口“存储”对象。

对于性能和内存使用,最佳选择是什么?

【问题讨论】:

    标签: python celery fileparsing


    【解决方案1】:

    使用 Memcached 听起来是一个更简单的解决方案 - 任务用于处理,memcached 用于存储 - 为什么使用任务进行存储?

    我个人建议使用 Redis 而不是 memcached。

    另一种方法是尝试 ZODB - 它以原生方式存储 Python 对象。如果您的应用程序确实受到序列化开销的影响,那么这可能会有所帮助。但我强烈建议使用您针对 JSON/memcached 的实际工作负载进行测试。

    【讨论】:

    • 因为我需要存储嵌套对象,又担心序列化/反序列化的成本。
    • 您是否不必序列化以将对象获取到您的长时间运行的任务?你觉得应该有什么样的get/set接口?
    • 您需要存储这些原生 python 对象吗?
    • 对象是一个可以包含dict的dict列表。基本上我只是在寻找一种有效的方法来处理任务之间的相同数据。
    • 从编码的角度来看 json->memcached 是最简单的解决方案。序列化开销是否会成为真正的问题完全取决于您的应用程序。我们做了一些类似的事情来在任务之间共享数据,我们发现虽然 json 序列化对于非常大的数据结构需要大量时间 a) 这与计算所需的时间相比相形见绌 b) 这是值得的,因为 json 很容易处理.
    猜你喜欢
    • 2016-06-21
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2012-07-22
    • 2012-08-18
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多