协程锁的原理是什么?
asyncio 同步原语被设计为与 threading 模块的类似,但有两个关键注意事项:
asyncio 原语不是线程安全的,因此它们不应被用于 OS 线程同步 (而应当使用 threading);
这些同步原语的方法不接受 timeout 参数;请使用 asyncio.wait_for() 函数来执行带有超时的操作。
asyncio 具有下列基本同步原语:
- Lock
- Event
- Condition
- Semaphore
- BoundedSemaphore
同步原语
python 官方提供了上面的 asyncio 下的同步原语
python 的一些第三方协程,比如 eventlet 也有提供, from eventlet.lock import Lock
多线程的锁是 os 提供的功能
协程的锁,要完全要应用自己实现吗?还是也需要 os 的帮助?
python 的 asyncio 的 lock 和 eventlet、gevent 的锁后背的实现原理有什么区别?
同样的,还有 java、golang 等等语言的协程锁实现都是什么原理?
回答:
python asyncio Lock里面就两个操作, Lock/UnLock.
Lock只是把自己塞到wait队列里面去, 如果设置当前状态为lock这个操作是成功的, 那么就唤醒队列的第一个人, 如果不成功就继续await等;
UnLock则把当前的状态设置成未lock状态, 然后看尝试从wait队列里面pop一个出来, 如果有多个人同时await一个lock, 那么第二个人就可以拿到锁.
至于其他语言的Mutex, 就要略微复杂一点, 因为涉及到多线程. 一般来讲是这样搞的:
- Lock
自旋的方式去设置当前的状态, 如果设置成功了, 则立马返回;
如果没有设置成功, 那么自旋超时之后, 就进入到当前锁的等待队列, 等待锁的持有者唤醒一个 - Unlock
重置当前锁的状态. 查看当前的等待队列, 如果队列里面有人, 就唤醒第一个. - 现代操作系统(语言)提供的锁, 都是库+操作系统的复杂实现, 会在库这个层面先自旋的去设置, 不成功的话, 才会进入到系统调用. 毕竟库层面自旋成本是非常低的.
- 多线程编程, 降低锁碰撞的概率, 会让程序的性能有明显的提升.
以上是 协程锁的原理是什么? 的全部内容, 来源链接: utcz.com/p/938501.html