如何构建一个处理队列中固定数量输入的Dask应用程序?

时间:2017-08-22 16:27:28

标签: dask dask-distributed

我们要求实施以下内容。给定一个Redis通道,它将提供已知数量的消息:

  1. 对于从频道消费的每条消息:

    • 从Redis获取JSON文档
    • 解析JSON文档,提取结果对象列表
  2. 汇总所有结果对象以生成单个结果

  3. 我们希望在许多工作人员中分发步骤1和2,并避免将所有结果收集到内存中。我们还想显示两个步骤的进度条。

    但是,我们无法看到构建应用程序的好方法,这样我们就可以看到进度,并保持工作在系统中移动而不会因为不合时宜而阻塞。

    例如,在步骤1中,如果我们从Redis通道读入队列,那么我们可以将队列传递给Dask,在这种情况下,我们开始处理每个消息,而不等待所有消息。但是,如果我们使用队列,我们​​无法看到显示进度的方法(可能是因为队列通常具有未知大小?)

    如果我们从Redis频道收集到一个列表并将其传递给Dask,那么我们可以看到进度,但我们必须等待来自Redis的所有消息才能开始处理第一个消息。

    是否有建议的方法来解决这类问题?

1 个答案:

答案 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)