Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将上下文管理器与multiprocessing.Manager结合使用有什么好处?_Python_Python 3.x_Multiprocessing_Contextmanager - Fatal编程技术网

Python 将上下文管理器与multiprocessing.Manager结合使用有什么好处?

Python 将上下文管理器与multiprocessing.Manager结合使用有什么好处?,python,python-3.x,multiprocessing,contextmanager,Python,Python 3.x,Multiprocessing,Contextmanager,在中,Manager与上下文管理器一起使用(即带有的),如下所示: 但是除了名称空间之外,这有什么好处呢?对于打开文件流,好处非常明显,因为您不必手动.close()连接,但它对Manager有什么好处?如果您没有在上下文中使用它,您必须使用哪些步骤来确保所有内容都正确关闭 简言之,使用上述方法的好处是什么 manager = MyManager() maths = manager.Maths() print(maths.add(4, 3)) # prints 7 print(m

在中,Manager与上下文管理器一起使用(即带有的
),如下所示:

但是除了名称空间之外,这有什么好处呢?对于打开文件流,好处非常明显,因为您不必手动
.close()
连接,但它对Manager有什么好处?如果您没有在上下文中使用它,您必须使用哪些步骤来确保所有内容都正确关闭

简言之,使用上述方法的好处是什么

manager = MyManager()
maths = manager.Maths()
print(maths.add(4, 3))         # prints 7
print(maths.mul(7, 8))         # prints 56
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)
但是这个(…)有什么好处呢

首先,您获得了几乎所有上下文管理器的主要好处。您有一个定义良好的资源生命周期。当打开
with…:
块时,将分配和获取它。当块结束时(通过到达末尾或由于引发异常),将释放它。每当垃圾回收器找到它时,它仍然会被释放,但由于外部资源已经被释放,所以这一点就不那么重要了

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

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

如果不使用上下文管理器并且不调用管理器上的shutdown,则“服务器”进程将继续运行,直到运行
SyncManager
\u del\u
。在某些情况下,这可能在创建
SyncManager
的代码完成后不久发生(例如,如果它是在一个短函数中创建的,并且函数正常返回,并且您正在使用CPython,那么引用计数系统可能会很快注意到对象已死亡,并调用其
\u del\u
)。在其他情况下,它可能需要更长的时间(如果引发异常并保留对经理的引用,那么它将保持活动状态,直到该异常得到处理)。在某些糟糕的情况下,它可能根本不会发生(如果
SyncManager
在引用循环中结束,那么它的
\u del\u
将阻止循环收集器收集它;或者您的进程可能在调用
\u del\u
之前崩溃)。在所有这些情况下,您都放弃了对清理
SyncManager
创建的额外Python进程的控制。这些进程可能代表系统上非平凡的资源使用。在非常糟糕的情况下,如果您在一个循环中创建
SyncManager
,那么最终可能会创建许多同时存在并且很容易消耗大量资源的对象

如果您没有在上下文中使用它,您必须使用哪些步骤来确保所有内容都正确关闭

您必须自己实现上下文管理器协议,就像您不使用
而使用
时使用的任何上下文管理器一样。在仍然正确的情况下,在纯Python中实现这一点很难。比如:

manager = MyManager()
maths = manager.Maths()
print(maths.add(4, 3))         # prints 7
print(maths.mul(7, 8))         # prints 56
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)
start
shutdown
也分别是
\uuuuuuuuuuuuuuu进入
\uuuuuuu退出
的别名

但是这个(…)有什么好处呢

首先,您获得了几乎所有上下文管理器的主要好处。您有一个定义良好的资源生命周期。当打开
with…:
块时,将分配和获取它。当块结束时(通过到达末尾或由于引发异常),将释放它。每当垃圾回收器找到它时,它仍然会被释放,但由于外部资源已经被释放,所以这一点就不那么重要了

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

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

如果不使用上下文管理器并且不调用管理器上的shutdown,则“服务器”进程将继续运行,直到运行
SyncManager
\u del\u
。在某些情况下,这可能在创建
SyncManager
的代码完成后不久发生(例如,如果它是在一个短函数中创建的,并且函数正常返回,并且您正在使用CPython,那么引用计数系统可能会很快注意到对象已死亡,并调用其
\u del\u
)。在其他情况下,它可能需要更长的时间(如果引发异常并保留对经理的引用,那么它将保持活动状态,直到该异常得到处理)。在某些糟糕的情况下,它可能根本不会发生(如果
SyncManager
在引用循环中结束,那么它的
\u del\u
将阻止循环收集器收集它;或者您的进程可能在调用
\u del\u
之前崩溃)。在所有这些情况下,您都放弃了对清理
SyncManager
创建的额外Python进程的控制。这些进程可能代表系统上非平凡的资源使用。在非常糟糕的情况下,如果您在一个循环中创建
SyncManager
,那么最终可能会创建许多同时存在并且很容易消耗大量资源的对象

如果您没有在上下文中使用它,您必须使用哪些步骤来确保所有内容都正确关闭

您必须自己实现上下文管理器协议,就像您不使用
而使用
时使用的任何上下文管理器一样。在仍然正确的情况下,在纯Python中实现这一点很难。比如:

manager = MyManager()
maths = manager.Maths()
print(maths.add(4, 3))         # prints 7
print(maths.mul(7, 8))         # prints 56
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)
start
shutdown
也是
\uuuuuuuuuuuuuuuu进入
\uuuuuuu退出
的别名