我有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配合使用
谢谢
答案 0 :(得分:0)
达克斯袋可以很好地处理发电机
def f(partition):
for x in partition:
yield x + 1
my_bag.map_partitions(f).map(print)
这将为每个元素添加一个,然后在移至下一个元素之前进行打印