跳转到主要内容

asyncio的读写锁。

项目描述

https://github.com/aio-libs/aiorwlock/workflows/CI/badge.svg https://codecov.io/gh/aio-libs/aiorwlock/branch/master/graph/badge.svg Chat on Gitter Downloads count

asyncio提供读写锁。一个RWLock维护一对相关锁,一个用于只读操作,另一个用于写入。只要没有写入者,多个读任务可以同时持有读锁。写锁是排他的。

是否使用读写锁比互斥锁能提高性能取决于数据被读取的频率与被修改的频率之间的关系。例如,最初填充了数据并且之后很少被修改、经常被搜索的集合是使用读写锁的理想选择。然而,如果更新变得频繁,那么数据大部分时间都处于独占锁定状态,并且并发性几乎没有增加。

实现几乎是从这个补丁直接移植过来的。

示例

import asyncio
import aiorwlock


async def go():
    rwlock = aiorwlock.RWLock()

    # acquire reader lock, multiple coroutines allowed to hold the lock
    async with rwlock.reader_lock:
        print('inside reader lock')
        await asyncio.sleep(0.1)

    # acquire writer lock, only one coroutine can hold the lock
    async with rwlock.writer_lock:
        print('inside writer lock')
        await asyncio.sleep(0.1)


asyncio.run(go())

快速路径

默认情况下,RWLock在获取锁时切换上下文。这允许其他等待的任务即使持有锁的任务不包含上下文切换(await fut语句)也能获取锁。

可以通过fast参数关闭默认行为:RWLock(fast=True)

简单来说:锁默认是安全的,但如果你确定在锁定代码内部有上下文切换(awaitasync withasync foryield from语句),你可能想使用fast=True来获得轻微的速度提升。

TLA+规范

本存储库提供的aiorwlock的TLA+规范。

许可协议

aiorwlock在Apache 2许可证下提供。

变更

1.4.0 (2024-01-20)

  • 延迟评估当前循环,允许在异步函数外部实例化锁。

  • 支持Python 3.11和3.12。

  • 停止支持Python 3.7。

1.3.0 (2022-01-18)

  • 停止支持Python 3.6

  • Python 3.10正式支持

  • RWLock构造函数中删除已弃用的loop参数

1.2.0 (2021-11-09)

  • 修复在某些(很少见的)组合下可能发生的并发写入的bug(#235)

1.1.0 (2021-09-27)

  • asyncio.sleep()调用中删除显式循环使用,使库与Python 3.10兼容

1.0.0 (2020-12-32)

  • 修复在获取期间取消的bug #170(感谢@romasku)

  • 弃用将显式loop参数传递给RWLock构造函数

  • 弃用在异步函数上下文之外创建RWLock实例

  • 最低支持的版本是Python 3.6

  • 库与Python 3.8和Python 3.9无缝工作

0.6.0 (2018-12-18)

  • 在写入者释放锁后唤醒所有读者 #60(感谢@ranyixu)

  • 修复Python 3.7兼容性

  • 删除旧的yield from语法

  • 最低支持的版本是Python 3.5.3

  • 删除对非异步上下文管理器的支持

0.5.0 (2017-12-03)

  • 修复将锁从写入升级到读取时的边缘情况和死锁 #39

  • 如果可能,使用loop.create_future代替asyncio.Future

0.4.0 (2015-09-20)

  • 支持Python 3.5和async with语句

  • 重命名.reader_lock -> .reader.writer_lock -> .writer。保留向后兼容性。

0.3.0 (2014-02-11)

  • 添加.locked属性

0.2.0 (2014-02-09)

  • 使.release()非协程

0.1.0 (2014-12-22)

  • 初始发布

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

aiorwlock-1.4.0.tar.gz (13.2 kB 查看哈希值)

上传于 来源

构建分发

aiorwlock-1.4.0-py3-none-any.whl (10.0 kB 查看哈希值)

上传于 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面