Dask如何处理函数定义中的外部或全局变量?

时间:2019-06-25 16:43:57

标签: dask

如果我有一个依赖于某些全局或其他常量的函数,如下所示:

x = 123

def f(partition):
    return partition + x  # note that x is defined outside this function

df = df.map_partitions(f)

这有效吗?还是我需要以某种方式显式地包含外部变量x

1 个答案:

答案 0 :(得分:0)

单个过程

如果您在单台计算机上并且未使用dask.distributed,则无所谓。变量x存在,不需要四处移动

分布式或多进程

如果我们必须在进程之间移动函数,则需要将该函数序列化为字节串。 Dask使用库cloudpickle来完成此操作。

cloudpickle库以捕获大多数设置中的外部变量的方式将Python函数f转换为bytes对象。因此,查看您的函数是否可以与Dask一起使用的一种方法是尝试对其进行序列化,然后在其他计算机上反序列化。

import cloudpickle
b = cloudpickle.dumps(f)

cloudpickle.loads(b)  # you may want to try this on your other machine as well

如何实现这一目标可能非常复杂。您可能需要查看他们的文档。