相关疑难解决方法(0)

上下文管理器和多处理池

假设您正在使用multiprocessing.Pool对象,并且您正在使用initializer构造函数的设置来传递初始化函数,然后在全局命名空间中创建资源.假设资源有一个上下文管理器.您将如何处理上下文管理资源的生命周期,前提是它必须贯穿整个过程的生命周期,但最终应该进行适当的清理?

到目前为止,我有点像这样:

resource_cm = None
resource = None


def _worker_init(args):
    global resource
    resource_cm = open_resource(args)
    resource = resource_cm.__enter__()
Run Code Online (Sandbox Code Playgroud)

从此处开始,池进程可以使用该资源.到现在为止还挺好.但处理清理有点棘手,因为multiprocessing.Pool类没有提供destructordeinitializer参数.

我的一个想法是使用该atexit模块,并在初始化程序中注册清理.像这样的东西:

def _worker_init(args):
    global resource
    resource_cm = open_resource(args)
    resource = resource_cm.__enter__()

    def _clean_up():
        resource_cm.__exit__()

    import atexit
    atexit.register(_clean_up)
Run Code Online (Sandbox Code Playgroud)

这是一个好方法吗?有更简单的方法吗?

编辑:atexit似乎没有工作.至少不是我上面使用它的方式,所以到目前为止我还没有解决这个问题的方法.

python multiprocessing contextmanager

20
推荐指数
1
解决办法
5123
查看次数

标签 统计

contextmanager ×1

multiprocessing ×1

python ×1