gpt4 book ai didi

python - Python 的 asyncio lock.acquire 是否维持秩序?

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:09 25 4
gpt4 key购买 nike

如果我有两个函数在做

async with mylock.acquire():
....

一旦释放锁,是保证先等待的会赢,还是选择的顺序不一样? (例如随机、任意、最新等)

我问的原因是,如果不是先到先得,可能很容易出现饥饿情况,即第一个尝试获取锁的函数永远不会赢得它。

最佳答案

当我们谈论某事如何运作时,区分规范中表达的保证和实现的副作用很重要。第一个不应更改(至少在主要版本中),第二个可以在将来随时更改。

Martijn 的回答清楚地表明当前的实现保留了顺序。 future 的保证呢?

官方文档for Python 3.6提供保证:

only one coroutine proceeds when a release() call resets the state to unlocked; first coroutine which is blocked in acquire() is being processed.

有趣的是,这两个文档都没有 for Python 3.7也没有文档 for Python 3.8 dev有这条线,但不确定它是否是故意的。但是 github 上的类文档字符串 has保证。

还值得一提的是 threading.Lock(asyncio 锁的原型(prototype))明确表示顺序未定义:

only one thread proceeds when a release() call resets the state to unlocked; which one of the waiting threads proceeds is not defined, and may vary across implementations.


长话短说,现在只有类的文档字符串 promise 维持秩序。同样值得注意的是,锁的实现在不久的将来不太可能改变。

然而想象一下有人会改变它(例如,为了提高性能)。文档字符串是否足以防止以未定义的顺序实现锁定?由您决定。

如果您的代码严重依赖于保留顺序并期望有较长的生命周期,那么如果您创建自己的锁(子)类将明确保证顺序(OrderedLock 或其他),这没什么不好。您可以只供应当前的实现。

如果情况更简单,您可以选择不去理会它并使用当前的实现。

关于python - Python 的 asyncio lock.acquire 是否维持秩序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55951233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com