为什么在简单的用例中将多处理的BaseManager子类化?

时间:2016-12-11 09:54:26

标签: python python-2.7 multiprocessing

我的问题是关于multiprocessing.Managers.BaseManager的正确用法。文档中的主要示例显示了如何通过创建BaseManager的子类来自定义此类。我可以理解是否有人这样做是为了修改或扩展BaseManager的行为。

但是在网络上,甚至在Stackoverflow上的answer中,人们通过创建一个根本不改变BaseManager行为的子类来演示BaseManager的用法:

def get_success_url(self):
    if self.object.workout_type = '5 rounds'
        return reverse('five-rounds-log-create')
    elif self.object.workout_type = 'Drop Reps'
        return reverse('drop-reps-log-create')
    else 
        return reverse('workout-log-menu')

我的问题是:在这种情况下,这样做有什么意义?为什么不直接使用BaseManager和BaseManager.register()?我错过了什么吗?

编辑:我发现了更多示例:herehere

1 个答案:

答案 0 :(得分:2)

BaseManager.registerclassmethod。这意味着如果您在BaseManager实例上调用register,项目中的所有其他代码段也将看到注册类型。如果其中一段代码试图做同样的事情,即直接用BaseManager注册自己的类型,使用与你相同的名称,这就成了一个问题。子类化BaseManager是一种避免此namespace pollution的方法。

如果您确定此问题永远不会影响您 - 例如,如果您正在编写程序而不是库,则会出现这种情况,并且您确信以后不会以某种方式扩展它这可能会破坏事情 - 然后使用BaseManager.register绝对没问题。 (请注意,这个观点是值得商榷的。我认为这很好,因为我更喜欢实用的方法。另一种观点是, 时你最终想要扩展你的程序,你可能已经忘记了这件事会破裂,因此最好先把它弄好。)