【问题标题】:Python Multiprocessing manager prunes some methodsPython多处理管理器修剪一些方法
【发布时间】:2021-10-24 14:09:31
【问题描述】:

我发现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

令人惊讶的是,大多数其他方法(例如integratedifferentiate)都按预期工作。不过,__call__ 方法并不存在。

有解决办法吗?

【问题讨论】:

    标签: python class multiprocessing magic-methods


    【解决方案1】:

    你是说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
    

    【讨论】:

    • 您好,很抱歉,我无法解决您之前通过link 提供帮助的问题,您能帮忙吗?
    • @PyNoob 您的链接指向您未发布但已接受答案的问题。那么你需要什么帮助呢?
    • 你是对的。解决方案之一是接受的答案并解决了问题。对于引起的关注,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2018-01-13
    • 2022-01-21
    相关资源
    最近更新 更多