python - 记录异步调用的正确/常用方法

标签 python asynchronous python-3.5 python-asyncio

假设我们有一个 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/

相关文章:

c++ - Python 到 C++ : From Deriv, 到 Base,再到 Deriv

python - Defaultdict(defaultdict) 用于文本分析

unicode - Python 3 UnicodeEncodeError : 'ascii' codec can't encode characters

python - 为什么 pip freeze list "pkg-resources==0.0.0"?

python - 如何在 Python 3 urllib.request.urlopen() 函数中传递带空格的 URL?

python - 如何使用 cv2 计算图像中的不同颗粒?

python - 使用 Python 打开新窗口时,selenium window_handles 不正确

asynchronous - Grunt 任务删除 mongoose 数据库

asynchronous - TypeScript/Angular 2 - 在另一个完成后调用一个函数

在 WCF 中使用命名管道的 C# 异步调用