IMO,锁定解决方案对性能的影响很大,主要是在多线程真正等待它时。
获取和释放非竞争锁的成本应该是微不足道的。
这个线程显示了一个关于那个的测试。
好的,这是在 Linux 下使用 Python 3.2 获取和释放非竞争锁的成本:
$ python3 -m timeit \
-s "from threading import Lock; l=Lock(); a=l.acquire; r=l.release" \
"a(); r()"
10000000 loops, best of 3: 0.127 usec per loop
以下是调用虚拟 Python 函数的成本:
$ python3 -m timeit -s "def a(): pass" "a(); a()"
1000000 loops, best of 3: 0.221 usec per loop
这是调用一个普通的 C 函数(返回 False 单例)的成本:
$ python3 -m timeit -s "a=bool" "a(); a()"
10000000 loops, best of 3: 0.164 usec per loop
另外,请注意,使用锁作为上下文管理器实际上更慢,而不是你想象的更快:
$ python3 -m timeit -s "from threading import Lock; l=Lock()" \
"with l: pass"
1000000 loops, best of 3: 0.242 usec per loop
至少在Linux下,锁性能似乎没有太大的提升空间,至少可以这么说。
PS:RLock 现在和 Lock 一样快:
$ python3 -m timeit \
-s "from threading import RLock; l=RLock(); a=l.acquire; r=l.release" \
"a(); r()"
10000000 loops, best of 3: 0.114 usec per loop