假设我们有一个 IO 操作的异步调用,我们想要记录它。 最简单的方法如下所示:
async def f():
logger.log('io was called')
await call_some_io()
但是当我们运行 log()
函数时,我们显然会遇到这种情况,该函数切换上下文并记录其他内容,并且仅在此之后执行 call_some_io()
。
下一个方法看起来更健壮:
async def f():
await call_some_io()
logger.log('io was called')
我们正在等待 call_some_io() 并在它之后记录它。看起来在这种情况下我们有一致的调用。
但是还有第三种使用上下文管理器的方法:
async def f():
with LoggingContext:
await call_some_io()
这里的 LoggingContext
是一些 ContextManager,其中 __exit__
方法有一些日志调用。
所以问题是:哪种记录异步调用的方法最常见且最可靠?
最佳答案
所有方法都是稳健的。上下文管理器可能不那么常见,但仍然很强大。
但是,示例 #1 和 #2 具有不同的语义。第一条日志消息应该是 about to call io
而不是 io was called
,因为还没有发出调用。
LoggingContext
示例对开发人员来说相当方便,但在执行顺序方面与示例 #2 相同。
关于python - 记录异步调用的正确/常用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40868251/