首页 > 解决方案 > 类内的射线多处理(TypeError:参数缺少默认值)

问题描述

我正在尝试使用 python 多进程包ray来并行化一个类中的卷积过程。

这意味着我正在使用@ray.remote装饰器将函数设置为类函数。

但是,当我这样做时,我会收到与参数默认值有关的错误。

我是使用射线和装饰器的新手,所以我想知道是否有人对我哪里出错有一些建议,因为我认为这不像为类函数提供可选的默认参数那样简单None,例如。


这是代码的简化版本:

import numpy as np
import psutil
import ray
from astropy.convolution import convolve

class test_class:

    def __init__(self,cube):
        self.cube = cube

    @ray.remote
    def func(self, cube, psf):
        cube = convolve(cube, psf)
        return cube

    def calculation(self):

        num_cpus = psutil.cpu_count(logical=False) 
        ray.shutdown()
        ray.init(num_cpus=num_cpus)

        filters = np.array([[0,.5,0],[.5,.7,.5],[0,.5,0]]) 

        results =  []
        for i in range(self.cube.shape[2]):
            results.append(self.func.remote(self.cube[:,:,i],filters))  
        results = np.array(ray.get(results)).T

        ray.shutdown()

        return results

运行代码...

cube = np.random.uniform(0,1,(100,100,10))
new_cube = test_class(cube).calculation()

以及由此产生的错误:

TypeError:“psf”参数缺少默认值


我发现了一个类似的帖子,但我不确定这两个问题是否相似,因为处理ray不同的执行以及我对使用这个包的天真。

提前谢谢了!

标签: pythonmultiprocessingdefault-valueray

解决方案


这个问题是通过移动类函数来解决的:

@ray.remote
    def func(self, cube, psf):
        cube = convolve(cube, psf)
        return cube

...在类函数self.calculation中,并删除self


更新:失败的原因可以在这篇文章中看到


推荐阅读