2016-12-11 20 views
2

我的問題是關於multiprocessing.Managers.BaseManager的正確用法。文檔中的主要示例顯示瞭如何通過創建BaseManager的子類來自定義此類。我可以理解,如果有人這樣做是爲了修改或擴展BaseManager的行爲。爲什麼在簡單用例中將多重處理的BaseManager子類化?

但在網絡上,甚至在#2人的answer證明BaseManager的通過創建子類的使用不改變BaseManager在所有的行爲:

class MyManager(BaseManager): pass 

我的問題是:什麼是在這種情況下指出這一點?爲什麼不直接使用BaseManager和BaseManager.register()?我錯過了什麼嗎?

編輯:我發現更多的例子:herehere

回答

1

BaseManager.registerclassmethod。這意味着如果您在BaseManager實例上調用註冊,項目中的所有其他代碼片段也會看到註冊類型。如果其他代碼片段中的一個試圖執行相同的操作,即直接在BaseManager上註冊自己的類型,則使用相同的名稱。子類BaseManager是避免這種namespace pollution的一種方法。

如果你確定這個問題永遠不會影響你 - 例如,如果你正在編寫一個程序,而不是一個庫,而且你確信你以後不會延長它方式可能會破壞的東西 - 然後使用BaseManager.register是絕對好的。 (注意這個觀點是有爭議的,我認爲這很好,因爲我更喜歡實用的方法;另一種觀點是,在你最終想要擴展你的程序,你可能已經忘記了這個會破壞的東西,因此它是一個好主意,使其在第一個地方..)

+0

謝謝。現在我明白了它背後的動機。 – ThoWe

相關問題