繁体   English   中英

使用未传递参数的 Dask 延迟 function 调用

[英]Dask delayed function call with non-passed parameters

在使用dask.delayed调用取决于参数的 function 时,我正在寻求更好地理解以下行为。 当在 configparser 读取的参数文件中指定参数时,似乎会出现此问题。 这是一个完整的例子:

参数文件:

#zpar.ini: parameter file for configparser

[my pars]
my_zpar = 2.

解析器:

#zippy_parser
import configparser

def read(_rundir):

    global rundir
    rundir = _rundir

    cp = configparser.ConfigParser()
    cp.read(rundir + '/zpar.ini')

    #[my pars]
    global my_zpar
    my_zpar = cp['my pars'].getfloat('my_zpar')

和主 python 文件:

# dask test with configparser
import dask
from dask.distributed import Client
import zippy_parser as zpar


def my_func(x, y):

    # print stuff
    print("parameter from main is: {}".format(main_par))
    print("parameter from configparser is: {}".format(zpar.my_zpar))

    # do stuff
    return x + y


if __name__ == '__main__':

    client = Client(n_workers = 4)

    #read parameters from input file
    rundir = '/path/to/parameter/file'
    zpar.read(rundir)

    #test zpar
    print("zpar is {}".format(zpar.my_zpar))

    #define parameter and call my_func
    main_par = 5.
    z = dask.delayed(my_func)(1., 2.)
    z.compute()

    client.close()

my_func() 中的第一个 print 语句执行得很好,但第二个 print 语句引发了异常。 output 是:

 zpar is 2.0 parameter from main is: 5.0 distributed.worker - WARNING - Compute Failed Function: my_func args: (1.0, 2.0) kwargs: {} Exception: AttributeError("module 'zippy_parser' has no attribute 'my_zpar'",)

我是新手。 我想这与序列化有关,我不明白。 有人可以启发我和/或指出相关文件吗? 谢谢!

我会尽量保持简短。

当 function 被序列化以便发送给工作人员时,python 还发送 function 所需的局部变量和函数(其“闭包”)。 但是,它按名称存储它引用的模块,它不会尝试序列化您的整个运行时。 这意味着zippy_parser是在 worker 中导入的,而不是反序列化的。 由于 function read从未在工作程序中调用过,因此从未初始化global变量。

因此,您可以在工作人员中调用read作为 function 或其他方式的一部分,但使用 function 的模式或设置模块全局变量可能不是很好。 Dask 的延迟机制更喜欢功能纯度,您获得的结果不应依赖于运行时的当前 state。

(请注意,如果您在主脚本中调用read之后创建了客户端,则工作人员可能已经获得了内存版本,具体取决于如何配置在您的系统上创建子进程)

我鼓励您将所有参数显式传递给您的 dask 延迟函数,而不是依赖于全局命名空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM