在multiprocessing.Manager中使用上下文管理员有什么好处?

Bra*_*roy 1 python multiprocessing contextmanager python-3.x

文档中,Manager与上下文管理器(即with)一起使用,如下所示:

from multiprocessing.managers import BaseManager

class MathsClass:
    def add(self, x, y):
        return x + y
    def mul(self, x, y):
        return x * y

class MyManager(BaseManager):
    pass

MyManager.register('Maths', MathsClass)

if __name__ == '__main__':
    with MyManager() as manager:
        maths = manager.Maths()
        print(maths.add(4, 3))         # prints 7
        print(maths.mul(7, 8))         # prints 56
Run Code Online (Sandbox Code Playgroud)

但是,除了名称空间之外,这样做还有什么好处?对于打开文件流,其好处是显而易见的,因为您不必手动.close()进行连接,但这对Manager有什么作用?如果您不在上下文中使用它,则必须使用什么步骤来确保所有内容均正确关闭?

简而言之,与上述类似,使用以上内容有什么好处:

manager = MyManager()
maths = manager.Maths()
print(maths.add(4, 3))         # prints 7
print(maths.mul(7, 8))         # prints 56
Run Code Online (Sandbox Code Playgroud)

Jea*_*one 5

但是,此(...)有什么好处?

首先,您可以获得几乎所有上下文管理器的主要好处。您有一个明确定义的资源生存期。当with ...:块打开时分配和获取它。当块结束时(通过到达末尾或引发异常)释放它。每当垃圾收集器到处走时,它仍会被释放,但是由于外部资源已被释放,因此不必担心。

对于multiprocessing.ManagerSyncManager尽管它Manager看起来很像一个类,它是一个返回a的函数),资源是保存状态的“服务器”进程和共享该状态的多个工作进程。

Manager的[使用上下文管理器的好处]是什么?

如果你不使用上下文管理器,你也不要称呼经理关机不那么直到“服务器”进程将继续运行SyncManager__del__运行。在某些情况下,这可能会在SyncManager完成创建代码的代码后立即发生(例如,如果在短函数内创建该函数,并且该函数正常返回并且您使用的是CPython,则引用计数系统可能会很快注意到该对象已死,将其调用__del__)。在其他情况下,它可能需要更长的时间(如果引发异常并保留对管理器的引用,则它将一直有效直到处理该异常为止)。在某些情况下SyncManager__del__一点都没有 ; 否则您的进程可能会在__del__调用之前崩溃)。在所有这些情况下,您都无法控制何时清理由创建的额外Python进程SyncManager。这些过程可能表示系统上的重要资源使用情况。在非常糟糕的情况下,如果您创建SyncManager一个循环,那么最终可能会创建许多同时存在并且很容易消耗大量资源的资源。

如果您不在上下文中使用它,则必须使用什么步骤来确保所有内容均正确关闭?

您必须自己实现上下文管理器协议,就像您在不使用的情况下使用任何上下文管理器一样with。在仍然正确的情况下,使用纯Python进行操作很棘手。就像是:

manager = None
try:
    manager = MyManager()
    manager.__enter__()
    # use it ...
except:
    if manager is not None:
        manager.__exit__(*exc_info())
else:
    if manager is not None:
        manager.__exit__(None, None, None)
Run Code Online (Sandbox Code Playgroud)

startshutdown也的别名__enter____exit__分别。