将(特定的)芹菜结果对象保留在 NoSQL 后端以供独立使用
Keep (specific) celery result objects in NoSQL backend for independent usage
对于 celery 的高级用户来说,这是一个相当具体的问题。让我解释一下我的用例:
用例
我必须 运行 ~1k-100k 任务,这些任务将 运行 模拟(电影)和 return 模拟数据作为一个相当大的较小对象列表(帧),比如每帧 10k-100k 和 1k 帧。所以产生的数据总量会非常大,但是假设我有一个数据库可以处理这个。速度在这里不是关键因素。稍后我需要计算每个帧的特征,这些特征可以完全独立地完成。
框架看起来像一个 dict
,指向一些 numpy 数组和其他简单数据,如字符串和数字,并具有唯一标识符 UUID。
重要的是,最终感兴趣的对象是这些生成列表的任意连接和拆分。作为一个比喻,考虑将结果电影切碎并重新组合成新电影。这些最终列表(电影)基本上是使用 UUID 对帧的引用列表。
现在,我考虑使用 celery 获取这些第一部电影,因为无论如何这些最终都会在后端数据库中,我可能会无限期地保留这些结果,至少是我指定要保留的那些。
我的问题
我能否配置一个后端,最好是一个 NonSQL 数据库,以保持结果并在以后使用对象 UUID 独立于 Celery 访问这些结果。如果是这样,由于开销和性能等原因,这是否有意义
另一种可能性是不return任何东西,让工作人员将结果存储在数据库中。那是首选吗?当 Celery 已经可以做到这一点时,似乎没有必要与另一个数据库进行第二个通信渠道。
我也对关于将 Celery 通常用于 运行 长 (>1h) 和 return 大结果对象的高度独立任务的评论感兴趣。失败没有问题,可以重新启动。由此产生的电影是随机的!所以函数式方法可能会有问题。即使存储随机种子也可能无法保证可重现的结果!虽然我没有副作用。我只是可能有很多分布广泛的可用工人。想象一下在一个封闭的环境中有很多台式机,即使速度很慢,每个工作人员都会提供帮助。网络速度和安全性在这里不是问题。我知道这不是最初的用例,但在这些情况下使用它似乎非常容易。我发现最好的类比是像 Folding@Home 这样的项目。
Can I configure a backend, preferably a NonSQL DB, in a way to keep the results and access these later independent from Celery using the objects UUID.
是的,您可以配置celery 将其结果存储在NoSQL 数据库中,例如redis,以便稍后通过UUID 访问。将控制您感兴趣的行为的两个设置是 result_expires
and result_backend
。
result_backend
将指定您要将结果存储在哪个 NoSQL 数据库中(例如,elasticsearch 或 redis),而 result_expires
将指定任务完成后多长时间任务结果可用用于访问。
任务完成后,您可以像这样访问 python 中的结果:
from celery.result import AsyncResult
result = task_name.delay()
print result.id
uuid = result.id
checked_result = AsyncResult(uuid)
# and you can access the result output here however you'd like
And if so does that make sense because of overhead and performance, etc.
我认为这个策略非常有道理。在为网络用户生成 long-running 报告时,我通常会多次使用它。初始 post 将 return 来自 celery 任务的 UUID。 Web 客户端可以使用 UUID 通过 javascript 轮询应用服务器以查看任务是否为 ready/complete。报告准备就绪后,页面可以将用户重定向到允许用户通过传入 UUID 下载或查看报告的路由。
对于 celery 的高级用户来说,这是一个相当具体的问题。让我解释一下我的用例:
用例
我必须 运行 ~1k-100k 任务,这些任务将 运行 模拟(电影)和 return 模拟数据作为一个相当大的较小对象列表(帧),比如每帧 10k-100k 和 1k 帧。所以产生的数据总量会非常大,但是假设我有一个数据库可以处理这个。速度在这里不是关键因素。稍后我需要计算每个帧的特征,这些特征可以完全独立地完成。
框架看起来像一个 dict
,指向一些 numpy 数组和其他简单数据,如字符串和数字,并具有唯一标识符 UUID。
重要的是,最终感兴趣的对象是这些生成列表的任意连接和拆分。作为一个比喻,考虑将结果电影切碎并重新组合成新电影。这些最终列表(电影)基本上是使用 UUID 对帧的引用列表。
现在,我考虑使用 celery 获取这些第一部电影,因为无论如何这些最终都会在后端数据库中,我可能会无限期地保留这些结果,至少是我指定要保留的那些。
我的问题
我能否配置一个后端,最好是一个 NonSQL 数据库,以保持结果并在以后使用对象 UUID 独立于 Celery 访问这些结果。如果是这样,由于开销和性能等原因,这是否有意义
另一种可能性是不return任何东西,让工作人员将结果存储在数据库中。那是首选吗?当 Celery 已经可以做到这一点时,似乎没有必要与另一个数据库进行第二个通信渠道。
我也对关于将 Celery 通常用于 运行 长 (>1h) 和 return 大结果对象的高度独立任务的评论感兴趣。失败没有问题,可以重新启动。由此产生的电影是随机的!所以函数式方法可能会有问题。即使存储随机种子也可能无法保证可重现的结果!虽然我没有副作用。我只是可能有很多分布广泛的可用工人。想象一下在一个封闭的环境中有很多台式机,即使速度很慢,每个工作人员都会提供帮助。网络速度和安全性在这里不是问题。我知道这不是最初的用例,但在这些情况下使用它似乎非常容易。我发现最好的类比是像 Folding@Home 这样的项目。
Can I configure a backend, preferably a NonSQL DB, in a way to keep the results and access these later independent from Celery using the objects UUID.
是的,您可以配置celery 将其结果存储在NoSQL 数据库中,例如redis,以便稍后通过UUID 访问。将控制您感兴趣的行为的两个设置是 result_expires
and result_backend
。
result_backend
将指定您要将结果存储在哪个 NoSQL 数据库中(例如,elasticsearch 或 redis),而 result_expires
将指定任务完成后多长时间任务结果可用用于访问。
任务完成后,您可以像这样访问 python 中的结果:
from celery.result import AsyncResult
result = task_name.delay()
print result.id
uuid = result.id
checked_result = AsyncResult(uuid)
# and you can access the result output here however you'd like
And if so does that make sense because of overhead and performance, etc.
我认为这个策略非常有道理。在为网络用户生成 long-running 报告时,我通常会多次使用它。初始 post 将 return 来自 celery 任务的 UUID。 Web 客户端可以使用 UUID 通过 javascript 轮询应用服务器以查看任务是否为 ready/complete。报告准备就绪后,页面可以将用户重定向到允许用户通过传入 UUID 下载或查看报告的路由。