我看到有两种获得 asyncio
Lock 的方法:
async def main(lock):
async with lock:
async.sleep(100)
and
async def main(lock):
with await lock:
async.sleep(100)
它们之间有什么区别?
我看到有两种获得 asyncio
Lock 的方法:
async def main(lock):
async with lock:
async.sleep(100)
and
async def main(lock):
with await lock:
async.sleep(100)
它们之间有什么区别?
自 Python 3.7 起,第二种形式 with await lock
已被弃用,并在 Python 3.9 中删除。
在 Python 3.7 中运行时会出现以下警告:
DeprecationWarning: 'with await lock' 已被弃用,请使用 'async with lock'。
参考资料(请滚动到底部):
在功能上不应有任何差异。
但是,后者在 Python 3.9 中被移除了。请参见页面底部 https://docs.python.org/3/library/asyncio-sync.html
自版本3.9起更改:使用 await lock 或 yield from lock 和/或 with 语句(with await lock、with (yield from lock))来获取锁已被移除。请改用 async with lock。
async with lock
是异步上下文管理器的语句,它在进入 (__aenter__
) 和退出 (__aexit__
) 方法中挂起执行。 async with
从 Python 3.5 开始支持,并在 PEP 492 中得到了完整描述。 with await lock
在 Python 3.9 中已被正式删除,建议改用 async with lock
。
with await x
不等同于 async with x
。这只是一个技巧,锁被赋予了可等待性,特别是为了让 with await lock
起作用。该技巧已被移除,但 with await x
仍然是有效的语法 - 您可以等待一个对象并在等待结果上使用(普通的非异步)with
。但那种情况很少有用。 - user4815162342
with await lock
已被弃用,并在Python 3.9中消失。请勿使用它。 - user2357112