为什么Python需要Ayncio。
锁?
导言 了解之后,我想我已经学会了控制多层皮层所需的一切。
一个semaphore限制了多少个皮管可以同时执行.
之后我又想到另一个问题 如果Python的事件循环一次只执行一圈曲霉素,我们为什么还需要一圈锁?
起初,我假设一个锁是不必要的,因为只有一个线.
但经过对共享变量的实验,我意识到,尽管只有一种皮管在特定瞬间执行,但多种皮管仍然可以互相干扰.
在文章中,我将解释导致的问题,它是如何运作的,以及为什么几乎每个后端应用程序都使用它.
你会学到什么 为什么存在 什么是种族条件 什么是关键部分 Lock如何在内部工作 实践实例 现实世界后端 在学习前使用案例 Prerequisites , 你应该明白: Coroutines Event Loop 等待 Ayncio.
Semaphore问题假设我们有一个共享变量。
现在想象一下两个皮管试图增加它。
最初我预计最终值会变成 是因为两块皮层在增加计数器 但事实并非如此。
让我们看看到底发生了什么 最初现在Coroutine A开始执行。
皮管到达。
事件回路会暂停它,并开始另一个克洛丁.
现在Coroutine B执行。
注意一些有趣的东西。
两只胸围已经读取了"现在的胸围A"的简历.
随后Coroutine B复会.
最终值变成了这个,叫做种族条件.
为什么会这样?
起初我责怪事件循环。
后来我意识到 事件圈没有做错任何事 它的工作就是在皮层之间切换 只要它们到达...
真正的问题是,两只皮管都在修改同样的数据。
关键科 访问或修改共享数据的代码块称为"关键部分".
如果多层皮层执行此块,共享数据可能会变得不一致.
因此,这个块只应该一次由一个克罗提来执行.
Python's Solution Python引入了A Lock,确保每次只有一个Coroutine可以执行关键部分.
如果另一个Coroutine试图进入,它只是等待到锁被放出.
Lock Works如何想象只有一个键存在.
与司马彪不同,一个锁总是只允许里面有一条皮管.
现在实用示例输出 两种皮管安全执行 因为只有一个皮管可以进入关键部分 为什么和他在一起?
最初,我想知道,为什么我们写,而不是答案在我提出例外时变得很清楚。
锁从不放出.
彼等所取所取所取等相.
使用 Python 自动释放锁,即使出现例外.
如果洛克没有离开呢?
想象在线银行应用.
当前余额用户A用户B没有锁定,两种操作在更新前可能读取相同的余额.
最后的平衡是不正确的。
库存系统也存在同样的问题,即支付网关处理共享计数器命令数据库更新真实世界使用案例银行系统安全更新账户余额。
库存管理 防止两个客户购买最后的产品.
命令处理生成独有的命令编号 。
共享缓存安全更新共享缓存值 。
Lockprotections的优点 种族条件 保护共享资源 保持数据一致性 自动释放资源 与并行的应用程序 Makes 可靠的结论 最初我认为,因为只使用一线,种族条件不可能发生.
但是,在了解了每一处的皮层之间如何发生事件循环交换后,我意识到多层皮层仍然可以干扰共享数据.
不使程序成为同步程序。
它只是通过确保每次只有一个皮管执行关键部分来保证共享资源的安全.
一旦我理解了问题 它解决了,使用L