跳转到主要内容

Cython实现的高速、可重入、乐观锁

项目描述

FastRLock

这是CPython的一个C级实现,用于快速、可重入的乐观锁。它是threading.RLock的替代品。FastRLock是用Cython实现的,并提供了一个C-API,可以通过from fastrlock cimport rlockfrom cython.cimports.fastrlock import rlock直接从Cython代码中使用。

在正常条件下,它在Python 2.7中的速度比threading.RLock快约10倍,因为它避免了所有锁定,除非两个或更多线程同时尝试获取它。在拥塞状态下,由于Cython实现,它仍然比RLock快约10%。

这主要等同于Python 3.2中修订的RLock实现,但由于Cython实现而更快。然而,在Python 3.4及以后版本中,stdlib中的threading.RLock实现通过Python API调用时,通常与该包提供的锁一样快,甚至更快。当通过Cython API从其他Cython模块调用时,FastRLock在这些系统上仍然更快。

它最初在这里发布为代码配方:https://code.activestate.com/recipes/577336-fast-re-entrant-optimistic-lock-implemented-in-cyt/

FastRLock已在Lupa中使用了几年,并经过了测试。

它是如何工作的?

FastRLock 实现优化了非拥塞情况。它通过利用全局解释器锁(GIL)的可用性来工作。由于它知道在调用 acquire()/release() 方法时它持有 GIL,因此它可以安全地检查锁是否被其他线程持有,并且只要始终是相同的线程获取它,就可以简单地计数任何重入。这比实际获取底层锁要快得多。

当第二个线程也想获取锁时,它首先检查锁计数,发现锁已经被占用。如果底层锁已经被另一个线程占用,它就释放 GIL 并请求获取锁,就像 RLock 一样。然而,如果底层锁未被占用,它就立即获取它,并通过告诉当前所有者在完成时释放它来基本上转交所有权。然后,它回退到正常的非所有者行为,请求获取锁,并在最终释放时获取它。这确保了只有在至少两个线程想要时才获取真正的锁。

所有这些操作基本上都是原子的,因为任何修改锁状态的线程总是持有 GIL。请注意,实现必须在处理锁时不得调用任何 Python 代码,因为调用 Python 可能导致上下文切换,这会将 GIL 转交给另一个线程,从而破坏原子性。因此,代码滥用 Cython 的 ‘nogil’ 注解以确保不会意外地插入任何 Python 代码。

它有多快?

以下是 Python 2.7 的一些计时,用于以下场景

  1. 五个获取-释放周期(“lock_unlock”)

  2. 五个获取调用随后是五个释放调用(嵌套锁定,“reentrant_lock_unlock”)

  3. 获取和释放调用的混合和部分嵌套序列(“mixed_lock_unlock”)

  4. 五个不阻塞的获取-释放周期(“lock_unlock_nonblocking”)

所有这四种情况都针对单线程和多线程的情况进行了基准测试,其中多线程使用了 10 个线程。我还使用 20 个线程进行了测试,以查看它需要大约两倍的时间。请注意,拥塞情况对于两个锁都相当慢,基准测试包括线程创建时间,因此在这里我循环了 1000 次,而不是单线程情况的 100000 次,以获取有用的计时。

Testing _RLock (2.7.18)

sequential (x100000):
lock_unlock              :    853.55 msec
reentrant_lock_unlock    :    684.52 msec
mixed_lock_unlock        :    758.27 msec
lock_unlock_nonblocking  :    860.40 msec
context_manager          :   2876.00 msec

threaded 10T (x1000):
lock_unlock              :   2210.69 msec
reentrant_lock_unlock    :   1864.38 msec
mixed_lock_unlock        :   1963.10 msec
lock_unlock_nonblocking  :   3709.91 msec
context_manager          :   2640.32 msec

Testing FastRLock (0.8.1)

sequential (x100000):
lock_unlock              :    139.76 msec
reentrant_lock_unlock    :    137.56 msec
mixed_lock_unlock        :    140.75 msec
lock_unlock_nonblocking  :    164.64 msec
context_manager          :    593.06 msec

threaded 10T (x1000):
lock_unlock              :   1621.13 msec
reentrant_lock_unlock    :   1807.09 msec
mixed_lock_unlock        :   1834.21 msec
lock_unlock_nonblocking  :   1642.06 msec
context_manager          :   1730.29 msec

Testing Cython interface of FastRLock (0.8.1)

sequential (x100000):
lock_unlock              :     19.14 msec
reentrant_lock_unlock    :     19.12 msec
mixed_lock_unlock        :     16.81 msec
lock_unlock_nonblocking  :     14.49 msec

threaded 10T (x1000):
lock_unlock              :   1511.85 msec
reentrant_lock_unlock    :   1541.96 msec
mixed_lock_unlock        :   1585.70 msec
lock_unlock_nonblocking  :   1585.35 msec

它与 Python 3.7 及以后版本相比如何?

这里的结果更加复杂。根据 CPython 安装的优化,它可能更快,速度大致相同,或者略慢。无论如何,直接 Cython 接口总是比通过 Python API 更快,因为它避免了 Python 调用开销并执行 C 调用。

Testing RLock (3.10.1)

sequential (x100000):
lock_unlock              :    138.36 msec
reentrant_lock_unlock    :     95.35 msec
mixed_lock_unlock        :    102.05 msec
lock_unlock_nonblocking  :    131.44 msec
context_manager          :    616.83 msec

threaded 10T (x1000):
lock_unlock              :   1386.60 msec
reentrant_lock_unlock    :   1207.75 msec
mixed_lock_unlock        :   1319.62 msec
lock_unlock_nonblocking  :   1325.07 msec
context_manager          :   1357.93 msec

Testing FastRLock (0.8.1)

sequential (x100000):
lock_unlock              :     77.47 msec
reentrant_lock_unlock    :     64.14 msec
mixed_lock_unlock        :     73.51 msec
lock_unlock_nonblocking  :     70.31 msec
context_manager          :    393.34 msec

threaded 10T (x1000):
lock_unlock              :   1214.13 msec
reentrant_lock_unlock    :   1171.75 msec
mixed_lock_unlock        :   1184.33 msec
lock_unlock_nonblocking  :   1207.42 msec
context_manager          :   1232.20 msec

Testing Cython interface of FastRLock (0.8.1)

sequential (x100000):
lock_unlock              :     18.70 msec
reentrant_lock_unlock    :     15.88 msec
mixed_lock_unlock        :     14.96 msec
lock_unlock_nonblocking  :     13.47 msec

threaded 10T (x1000):
lock_unlock              :   1236.21 msec
reentrant_lock_unlock    :   1245.77 msec
mixed_lock_unlock        :   1194.25 msec
lock_unlock_nonblocking  :   1206.96 msec

fastrlock 更新日志

0.8.2 (2023-08-27)

  • 使用 Cython 3.0.2 重建以添加 Python 3.12 支持。

0.8.1 (2022-11-02)

  • 使用 Cython 3.0.0a11 重建以添加 Python 3.11 支持。

0.8 (2021-10-22)

  • 使用 Cython 3.0.0a9 重建以在最近的 Python 3.x 版本中提高性能。

0.7 (2021-10-21)

  • 适配未签名的线程 ID,如 Py3.7+ 所用。(由 Guilherme Dantas 提供的原始补丁)

  • 使用 Cython 0.29.24 构建,以支持 Py3.10 及以后版本。

0.6 (2021-03-21)

  • 使用 Cython 0.29.22 重建以支持 Py3.9 及以后版本。

0.5 (2020-06-05)

  • 使用 Cython 0.29.20 重建以支持 Py3.8 及以后版本。

0.4 (2018-08-24)

  • 使用 Cython 0.28.5 重建。

  • 通过配置指导优化,Linux 轮子更快。

  • 将缺少的文件添加到 sdist。(由 Mark Harfouche 提供的补丁,Github 问题 #5)

0.3 (2017-08-10)

  • 改进 C-API 的 cimport 支持(由 Naotoshi Seo 提供的补丁,Github 问题 #3)

  • 提供 fastrlock.__version__

0.2 (2017-08-09)

  • 将缺少的说明文件添加到 sdist

0.1 (2017-06-04)

  • 初始发布

项目详情


下载文件

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

源分发

fastrlock-0.8.2.tar.gz (79.5 kB 查看哈希值)

上传时间

构建分发

fastrlock-0.8.2-cp312-cp312-win_amd64.whl (30.1 kB 查看哈希值)

上传时间 CPython 3.12 Windows x86-64

fastrlock-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl (52.5 kB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl (51.5 kB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (50.7 kB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (52.4 kB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp312-cp312-macosx_10_15_universal2.whl (55.3 kB 查看哈希值)

上传时间 CPython 3.12 macOS 10.15+ universal2 (ARM64, x86-64)

fastrlock-0.8.2-cp311-cp311-win_amd64.whl (29.9 kB 查看哈希值)

上传时间 CPython 3.11 Windows x86-64

fastrlock-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl (52.2 kB 查看哈希值)

上传时间 CPython 3.11 musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl (52.8 kB 查看哈希值)

上传时间 CPython 3.11 musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (51.5 kB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (48.2 kB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (52.6 kB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (49.5 kB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (49.7 kB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp311-cp311-macosx_10_15_universal2.whl (54.9 kB 查看哈希值)

上传时间 CPython 3.11 macOS 10.15+ universal2 (ARM64, x86-64)

fastrlock-0.8.2-cp310-cp310-win_amd64.whl (29.8 kB 查看哈希值)

上传时间 CPython 3.10 Windows x86-64

fastrlock-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl (51.1 kB 查看哈希值)

上传时间 CPython 3.10 musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl (51.6 kB 查看哈希值)

上传时间 CPython 3.10 musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (50.2 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (47.4 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (51.3 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (48.5 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (48.6 kB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp310-cp310-macosx_11_0_x86_64.whl (30.5 kB 查看哈希值)

上传时间 CPython 3.10 macOS 11.0+ x86-64

fastrlock-0.8.2-cp39-cp39-win_amd64.whl (36.0 kB 查看哈希值)

上传时间 CPython 3.9 Windows x86-64

fastrlock-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl (53.2 kB 查看哈希值)

上传时间 CPython 3.9 musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl (53.5 kB 查看哈希值)

上传时间 CPython 3.9 musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (51.9 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (48.8 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (38.5 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (52.7 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (50.5 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl (37.4 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (50.6 kB 查看哈希值)

上传时间 CPython 3.9 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp39-cp39-macosx_11_0_x86_64.whl (31.2 kB 查看哈希值)

上传时间 CPython 3.9 macOS 11.0+ x86-64

fastrlock-0.8.2-cp38-cp38-win_amd64.whl (36.1 kB 查看哈希值)

上传时间 CPython 3.8 Windows x86-64

fastrlock-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl (53.0 kB 查看哈希值)

上传时间: CPython 3.8 musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl (52.9 kB 查看哈希值)

上传时间: CPython 3.8 musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (51.2 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (48.1 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (38.5 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (52.3 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (50.0 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl (37.3 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (50.3 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp37-cp37m-win_amd64.whl (36.6 kB 查看哈希)

上传时间 CPython 3.7m Windows x86-64

fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl (50.1 kB 查看哈希)

上传时间 CPython 3.7m musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl (49.9 kB 查看哈希)

上传时间 CPython 3.7m musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (47.9 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (45.3 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (39.6 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (49.4 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (47.2 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl (38.3 kB 查看哈希)

上传时间 CPython 3.7m manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (47.7 kB 查看哈希)

上传于 CPython 3.7m manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp36-cp36m-win_amd64.whl (34.7 kB 查看哈希值)

上传于 CPython 3.6m Windows x86-64

fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl (47.5 kB 查看哈希值)

上传于 CPython 3.6m musllinux: musl 1.1+ x86-64

fastrlock-0.8.2-cp36-cp36m-musllinux_1_1_aarch64.whl (47.6 kB 查看哈希值)

上传于 CPython 3.6m musllinux: musl 1.1+ ARM64

fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (45.7 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

fastrlock-0.8.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (43.4 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (37.8 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl (47.0 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.28+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_24_x86_64.whl (45.3 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.24+ x86-64 manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl (36.5 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (45.7 kB 查看哈希值)

上传时间: CPython 3.6m manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp36-cp36m-macosx_10_15_x86_64.whl (29.9 kB 查看哈希值)

上传时间: CPython 3.6m macOS 10.15+ x86-64

fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (37.6 kB 查看哈希值)

上传时间: CPython 3.5m manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl (36.2 kB 查看哈希值)

上传时间: CPython 3.5m manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp35-cp35m-macosx_10_15_x86_64.whl (29.7 kB 查看哈希值)

上传时间: CPython 3.5m macOS 10.15+ x86-64

fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl (35.7 kB 查看哈希值)

上传时间: CPython 2.7mu manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl (34.3 kB 查看哈希值)

上传时间: CPython 2.7mu manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (35.7 kB 查看哈希值)

上传时间: CPython 2.7m manylinux: glibc 2.5+ x86-64

fastrlock-0.8.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl (34.3 kB 查看哈希值)

上传时间: CPython 2.7m manylinux: glibc 2.5+ i686

fastrlock-0.8.2-cp27-cp27m-macosx_10_15_x86_64.whl (28.7 kB 查看哈希值)

上传于 CPython 2.7m macOS 10.15+ x86-64

由以下支持