我们要求实施以下内容。给定一个Redis通道,它将提供已知数量的消息:
对于从频道消费的每条消息:
汇总所有结果对象以生成单个结果
我们希望在许多工作人员中分发步骤1和2,并避免将所有结果收集到内存中。我们还想显示两个步骤的进度条。
但是,我们无法看到构建应用程序的好方法,这样我们就可以看到进度,并保持工作在系统中移动而不会因为不合时宜而阻塞。
例如,在步骤1中,如果我们从Redis通道读入队列,那么我们可以将队列传递给Dask,在这种情况下,我们开始处理每个消息,而不等待所有消息。但是,如果我们使用队列,我们无法看到显示进度的方法(可能是因为队列通常具有未知大小?)
如果我们从Redis频道收集到一个列表并将其传递给Dask,那么我们可以看到进度,但我们必须等待来自Redis的所有消息才能开始处理第一个消息。
是否有建议的方法来解决这类问题?
答案 0 :(得分:1)
如果您的Redis频道是并发访问安全的,那么您可以提交许多期货来从频道中提取元素。这些将在不同的机器上运行。
from dask.distributed import Client, progress
client = Client(...)
futures = [client.submit(pull_from_redis_channel, ..., pure=False) for _ in range(n_items)]
futures2 = client.map(process, futures)
progress(futures2)