我發現它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__方法是不存在的。
有解決方法嗎?
uj5u.com熱心網友回復:
你的意思是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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/335290.html
下一篇:MacOS的MusicKit匯入
