Python Multiprocessing管理器删除了一些方法



我发现Manager在实践中很少与大多数自定义对象一起工作,因为它删除了一些类成员。参见示例:

from multiprocessing import Manager
from scipy.interpolate import CubicSpline
cs_pure = CubicSpline([1,2,3], [1,2,3])
test_pure = cs_pure(1)
m = Manager()
m.register('CubicSpline', CubicSpline)
cs_m = m.CubicSpline([1,2,3], [1,2,3])
test_m = cs_m(1)

这将引发一个异常:

TypeError: 'AutoProxy[CubicSpline]' object is not callable

令人惊讶的是,大多数其他方法(如integrate,differentiate)都如预期的那样工作。但是,__call__方法是不存在的。

是否有解决这个问题的方法?

你是说test_m = cs_m(1)吗?

首先,根据我的经验,在启动管理器服务器之前,您必须向管理器的类注册一个托管类:

from multiprocessing.managers import SyncManager
from multiprocessing import Manager
from scipy.interpolate import CubicSpline
SyncManager.register('CubicSpline', CubicSpline)
m = Manager()
...

所以我不知道你是怎么做到的。如果您不需要使用SyncManager(例如dict)实现的所有其他已注册的托管类,则创建自己的管理器类也更常见。我将在下面的代码中演示这一点(根据您的意愿使用或不使用此技术)。

我认为问题在于,当您不定义自己的代理类时,__call__方法不会在为您生成的代理类中自动生成。而不是定义自己的代理类,我认为更简单的解决方案是子类化CubicSpline类,并添加一个额外的方法,如evaluate_polynomial,它将简单地调用超类__call__方法:

from multiprocessing.managers import BaseManager
from scipy.interpolate import CubicSpline
class CubicSplineManager(BaseManager):
pass
class MyCubicSpline(CubicSpline):
def evaluate_polynomial(self, *args, **kwargs):
return self.__call__(*args, **kwargs)
if __name__ == '__main__':
cs_pure = CubicSpline([1,2,3], [1,2,3])
test_pure = cs_pure(1)
print(test_pure)
CubicSplineManager.register('CubicSpline', MyCubicSpline)
m = CubicSplineManager()
m.start() # We must explicitly start the server
cs_m = m.CubicSpline([1,2,3], [1,2,3])
test_m = cs_m.evaluate_polynomial(1)
print(test_m)

打印:

1.0
1.0

相关内容

  • 没有找到相关文章

最新更新