![](/img/trans.png)
[英]Force a Dask Delayed object to compute all parameters before applying the 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.