异步读写锁。
aiorwlock的Python项目详细描述
asyncio的读写锁。RWLock维护一对关联的 锁,一个用于只读操作,一个用于写入。读锁可能是 由多个读卡器任务同时进行,只要 没有作家。写锁是独占的。
读写锁是否比使用 互斥锁取决于数据的读取频率read 相比于被修改的。例如,最初 用数据填充,之后很少修改,同时 频繁搜索是使用读写锁的理想选择。 但是,如果更新变得频繁,那么数据将花费大部分时间 被独占地锁定,即使并发性增加也很少。
实现几乎是这个patch的直接端口。
使用异步定义的示例
需要python 3.5+
importasyncioimportaiorwlockloop=asyncio.get_event_loop()asyncdefgo():rwlock=aiorwlock.RWLock(loop=loop)asyncwithrwlock.writer:# or same way you can acquire reader lock# async with rwlock.reader: passprint("inside writer")awaitasyncio.sleep(0.1,loop=loop)loop.run_until_complete(go())
快速路径
默认情况下,在获取锁时切换上下文。这样就可以 其他等待任务获得锁,即使持有锁的任务 不包含上下文开关(await fut语句)。
默认行为可以通过fast参数关闭: rwlock(fast=true)。
长话短说:锁在默认情况下是安全的,但如果你确定 上下文切换(等待,与异步,异步 语句)在锁定的代码中,您可能要使用 轻微加速。
许可证
aiorwlock是在apache 2许可下提供的。
更改
0.6.0(2018-12-18)
- 作家释放锁60后唤醒所有读者(谢谢@ranyixu)
- 修正了python 3.7的兼容性
- 从语法中删除了旧的yield
- 支持的最低版本是Python3.5.3
- 删除了对非异步上下文管理器的支持
0.5.0(2017-12-03)
- 在将lock从write升级到 阅读39
- 使用loop.create_future代替asyncio.future如果可能的话
0.4.0(2015-09-20)
- 支持python 3.5和用语句异步
- 重命名.reader\u lock->;.reader,.writer\u lock->; .writer。保留向后兼容性。
0.3.0(2014-02-11)
- 添加。已锁定属性
0.2.0(2014-02-09)
- 使.release()成为非协同程序
0.1.0(2014-12-22)
- 初始版本