2016-12-11 1 views
2

Мой вопрос касается правильного использования multiprocessing.Managers.BaseManager. Основной пример в документации показывает, как настроить этот класс, создав подкласс BaseManager. Я могу понять, если кто-то делает это, чтобы изменить или расширить поведение BaseManager.Почему BaseManager многопроцессорной обработки в простых случаях использования?

Но в сети и даже в answer на StackOverflow людей демонстрируют использование BaseManager путем создания подкласса, который не изменяет поведение BaseManager на все:

class MyManager(BaseManager): pass 

Мой вопрос: Что в таком случае? Почему бы не использовать BaseManager и BaseManager.register() напрямую? Я что-то упускаю?

EDIT: Я нашел еще больше примеров: here и here.

ответ

1

BaseManager.register является classmethod. Это означает, что если вы вызываете регистр на примере BaseManager, все остальные фрагменты кода в вашем проекте также будут видеть зарегистрированный тип. Это становится проблемой, если одна из этих других частей кода пытается сделать то же самое, то есть зарегистрировать свой собственный тип непосредственно с помощью BaseManager, используя те же имена, что и вы. Подкласс BaseManager - это способ избежать этого namespace pollution.

Если вы уверены, что эта проблема никогда не повлияет на вас - что, например, имеет место, если вы пишете программу, а не библиотеку, и вы совершенно уверены, что позже ее не продлеваете способ, который может сломать вещи - тогда использование BaseManager.register абсолютно нормально. (Заметим, однако, что это мнение спорно. Я думаю, что это нормально, потому что я предпочитаю прагматичный подход. Согласно другому мнению, в точке когда вы, наконец, хотите расширить свою программу, вы, вероятно, забыли об этой вещи, которые будут нарушать , и поэтому это хорошая идея, чтобы сделать это в первую очередь.)

+0

Спасибо. Теперь я понимаю мотивацию, стоящую за ней. – ThoWe