猿问

使用视频帧的内存缓存设置 Celery 任务作为 python 中的循环缓冲区策略

我想在Celery上构建一个多任务处理管道,并希望多个任务处理同一个视频文件。任务需要共享视频数据。因此,并非每个任务都必须从视频文件中解码和提取帧。视频数据将是提取帧的列表(并非视频的每一帧都需要)。

有什么解决方案可以有效地共享这些帧吗?任务可以在不同的节点上处理。但我不想像 Memcached 或 Redis 那样通过网络共享数据。任务应该在内存/缓存中查找视频数据,如果不存在,任务应该发出另一个任务来加载视频并提取帧到缓存。

(每个视频文件的生产者和多个消费者)

因此同一节点/机器上的任务能够共享缓存数据。不同节点上的两个任务通过缓存没有任何好处。

我不想缓存整个提取的视频,必须有一些循环缓冲区缓存。每个视频的缓存大小是固定的,比如说 100 帧。最快和最慢任务之间的差距不能超过 100 帧。内存/缓存中总共只有 100 帧。

出现两个主要问题:

  1. 任务设置

    任务 A:从视频中提取帧(生产者到内存/缓存)

    任务 B1:消耗帧并做实际工作(处理帧)

    . .

    任务Bn:消耗帧并做实际工作(处理帧)

    A、B1 - Bn 并行运行。但是这些任务必须在同一个节点上运行。如果 B 任务分布在不同的节点上,则必须产生另一个 A 任务(每个节点上有一个任务来解码和提取帧)。你在这里推荐什么方法?什么是最好的选择?

  2. Python缓存

    是否有任何缓存库/实现/解决方案最适合我的用例以在具有某些循环缓冲区实现的本地机器上缓存大数据?类似于DiskCache 的东西,但只能通过环形缓冲来缓存 100 帧。

你推荐什么方法和设计来实现我的用例?我想坚持使用 Celery 进行任务分配。


森栏
浏览 180回答 1
1回答
随时随地看视频慕课网APP

相关分类

Python
我要回答