我可以对整个模块使用上下文管理器吗?

Max*_*Tet 4 python contextmanager aiohttp

我想要一个在应用程序的生命周期内打开(输入?)的上下文管理器。它应该在模块加载时打开,并在模块销毁时关闭。

包装整个模块代码是行不通的,因为当模块加载完成时,上下文管理器将关闭,而当实际调用方法时,上下文管理器将不再打开。

import aiohttp

with context as c:

  def f1():
    c.do_something('one')

  def f2():
    c.do_something('two')
Run Code Online (Sandbox Code Playgroud)

具体来说,我想aiohttp.ClientSession为该模块创建一个,该模块可重用于多个不同的请求,并在应用程序停止时干净地关闭。为此使用上下文管理器是一个好主意还是有更好的方法?

blh*_*ing 7

上下文管理器不适合跨模块管理对象的生命周期。

相反,您可以向模块注册实例close的方法,以便在应用程序因任何原因停止时调用该方法。由于在这种情况下该方法是一个协程,因此将函数注册为协程作为参数:aiohttp.ClientSessionatexitcloseasyncio.runclose

import aiohttp
import asyncio
import atexit

c = aiohttp.ClientSession(some_url)
atexit.register(asyncio.run, c.close())
Run Code Online (Sandbox Code Playgroud)