python3.6,async with和await的区别

Posted

技术标签:

【中文标题】python3.6,async with和await的区别【英文标题】:python3.6, difference between async with and await 【发布时间】:2018-01-21 01:14:16 【问题描述】:

这里是来自 python 3.4 的新手开发者。

我的幼稚理解是看到协程是上下文管理器的时候才用async with这个关键字?

【问题讨论】:

嗨,对不起,我让你有这种感觉,我确实看过 PEP 492 资源,它有点简洁。我有点新和愚蠢,只是想确认一下。谢谢:) 很公平。虽然作为规则的坚持者,我认为您的问题与本网站无关,但作为一个处于您一般情况的人,我真的很高兴您得到了您正在寻找的解释。我想这意味着这将对网站的未来访问者合法有用,因此撤回投票。 感谢您的理解!我做了一个快速搜索,似乎在普通和异步上下文管理器之间没有任何比较,如果有人可以提供一些代码示例会很好:) @MadPhysicist 嗨,朋友,你好吗?我今天收到了“好问题徽章”的通知。再次感谢您给这个问题一个机会(我想我们的讨论很好)。希望在这个动荡的covid时期,您和您的家人一切都好。欢呼:P 我想它确实老化得很好。获得徽章的好工作。一切都很好。希望你也一样。 【参考方案1】:

来自PEP 492:

提出了一个异步上下文管理器的新声明:

async with EXPR as VAR:
    BLOCK

在语义上等价于:

mgr = (EXPR)
aexit = type(mgr).__aexit__
aenter = type(mgr).__aenter__(mgr)

VAR = await aenter
try:
    BLOCK
except:
    if not await aexit(mgr, *sys.exc_info()):
        raise
else:
    await aexit(mgr, None, None, None)

所以是的——它让给从给定上下文管理器的 __aenter__ 方法返回的协程,一旦返回就运行你的块,然后让给 __aexit__ 协程。

【讨论】:

以上是关于python3.6,async with和await的区别的主要内容,如果未能解决你的问题,请参考以下文章

python3.6 async/await 仍然与 fastAPI 同步工作

Express 和 async/await:我应该用 try/catch 包装吗?

Node.js 7 的 async await 终于来了,不过怎么觉得没啥用

Python 3.6.8 - multiprocessing.Pool.apply_async() 不工作

从 async/await 方法返回列表

[RS] gcc4.9.2编译python3.6.5出现