我试图了解调用编译代码(Fortran / C),序列化和分布式工作程序的问题。更具体地说,我有这样的代码:
def calc_z(ph, phb):
geopt = ph + phb
geopt_unstag = destagger(geopt, -3) # PYTHON WRAPT FORTRAN CODE
return geopt_unstag/Constants.G
其中destagger最终是对某些fortran代码的调用。
我这样安排:
client = Client('127.0.0.1:8786')
...
z = client.submit(calc_z, ph, phb)
并获得:
distributed.protocol.pickle-信息-无法序列化。例外:对象代理必须定义 reduce_ex () 追溯(最近一次通话): 文件“ /home/brownrig/miniconda3/envs/dask/lib/python3.7/site-packages/distributed/worker.py”,第2765行,在dumps_function中 结果=缓存[功能] KeyError:
在处理上述异常期间,发生了另一个异常:
回溯(最近通话最近): 在转储中的文件“ /home/brownrig/miniconda3/envs/dask/lib/python3.7/site-packages/distributed/protocol/pickle.py”,第41行
紧随其后的是几乎完全是pickle.py和cloudpickle.py发出的巨大痕迹
当我使用原始的本地调度程序时,一切正常:
z = dask.array.map_blocks(calc_z, ph, phb, dtype=float32)
dask.compute(z)
谁能解释这些问题是什么?
谢谢 里克