如何使用dask bag和延迟加入2个映射功能?

时间:2018-09-29 08:07:58

标签: python python-3.x dask

我有2个功能:find_components和processing_partition_component

import random
import dask.bag as db

def find_components(partition):
  # it will return a list of components
  return [x for x in range(1, random.randint(1,10))]

def processing_partition_component(part_comp):
  print("processing %s" % part_comp)

partitions=['2','3','4']

我想在一个分区上计算find_components(),然后获取每个分区的输出以生成用于processing_partition_component()的任务。并且计算不应等待所有find_coponents()完成。用命令的话来说,processing_partition_component()中的一个完成后应该立即调用processing_partition_component()。我已经尝试过了,但这不是我想要的:

db.from_sequence(partitions, partition_size=1).map(find_components).map(processing_partition_component).compute()
# Output:
processing [1, 2, 3, 4, 5]
processing [1, 2]
processing [1, 2, 3, 4, 5, 6, 7, 8, 9]

您可以看到processing_partition_component()以find_components()的整个输出为例:[1、2、3、4、5]。我想要的是任务应该在find_components()之后散开,并且每个processing_partition_component()应该只包含1个元素,例如1、2、3、4或5。预期的打印输出是

processing 1
processing 2
processing 3
....
processing 1  # from another output of find_components
...

如果是多线程,则打印输出的顺序会混合在一起,因此处理1可以彼此相邻打印3次

我不知道如何使用dask.bag和dask.delayed来做到这一点。我正在将最新的dask与python3配合使用

谢谢

1 个答案:

答案 0 :(得分:0)

达克斯袋可以很好地处理发电机

def f(partition):
    for x in partition:
        yield x + 1

my_bag.map_partitions(f).map(print)

这将为每个元素添加一个,然后在移至下一个元素之前进行打印