Python 中 有 CAS 的实现吗

2021-10-18 11:33:15 +08:00
 monetto

Google 了一下 "Python" "CAS",只是搜到了一些关于 GIL 的 ATOMIC 操作。

但是觉得 Python 的 Lock() 又有点沉,有大佬知道有没有类似 CAS 的轻量级实现吗?

5611 次点击
所在节点    Python
51 条回复
dqzcwxb
2021-10-18 12:12:15 +08:00
等一个莫名其妙喷 java 的
不过也有可能没有,因为 cas 不多学点 java 还真不知道是什么
Goat121
2021-10-18 12:24:18 +08:00
@dqzcwxb java 被喷不是语言的问题,正是因为你这种 java boy 太多,让我等羞于为伍,说自己写过几年 java 都心惊胆战怕被人误认为你们。
cas 和 java 又有什么关系了?人家实现 cas 的时候还没现代操作系统呢,你家 jvm 都没地方跑谢谢。
dqzcwxb
2021-10-18 13:14:38 +08:00
@Goat121 #2 "等一个莫名其妙喷 java 的"你可真会咬钩
我没说 cas 跟 java 有关系,只是某些喷 java 的喜欢带上
同理设计模式也跟 java 没啥关系,还不是天天喷 java 设计模式滥用?
还羞与为伍,笑死
BBCCBB
2021-10-18 13:22:17 +08:00
没发现有, python 单进程的, 直接用 Lock().
janxin
2021-10-18 13:23:48 +08:00
@dqzcwxb ???为什么喷 Java 要带上 CAS 啊,你说设计模式我还能理解
est
2021-10-18 13:36:31 +08:00
没有而且不需要。因为 GIL 直接保证了同步。
monetto
2021-10-18 13:41:12 +08:00
@est GIL 不等于线程安全,GIL 不保证线程变量同步。
dqzcwxb
2021-10-18 14:13:44 +08:00
@janxin #5 设计模式不是 java 独有的,也不是 java 发明
cas 不是 java 独有的,也不是 java 发明
securityCoding
2021-10-18 14:16:04 +08:00
设计模式跟语言无关 , 基本上有点名气的开源项目里面都是设计模式的影子在里面
greenmoon55
2021-10-18 14:25:12 +08:00
stach
2021-10-18 15:06:10 +08:00
Python 一般我都用 Lock() 来确保类似 i += 1 这种操作的原子性, 之前查找资料有实现原子性的一些库, 不过没用过.
ipwx
2021-10-18 15:17:19 +08:00
Python 的 CAS 将是一场灾难啊。。。GIL 把一个忙等待的线程切了进来。。。
Trim21
2021-10-18 15:18:24 +08:00
@est #6 保证不了,不说 if 和赋值之间会不会切线程,就是赋值也不一定安全
sujin190
2021-10-18 15:35:31 +08:00
CAS 是 cpu 指令级提供的冲突处理的,python 一个+1 操作都好多条 cpu 指令了,这个在 python 层面上来看已经毫无意义了吧
abersheeran
2021-10-18 15:41:31 +08:00
比较难想象 Python 怎么 CAS,l.a = b 不是原子的,这要变成三条字节码,两个 LOAD_NAME 和一个 STORE_NAME 。
如果直接用 a = b,那你压根拿不到 a 的结果,因为 Python 没有指针,函数里赋值过去就没了。
如果用 nonlocal global 去修复拿结果的问题,那就没办法做到无副作用,而且这只是换了个 name,对象所在的内存还是没有变化。

综上所述,建议直接 threading.Lock,不会有人上了 Python 还扣这个锁的性能吧?大可不必啊
abersheeran
2021-10-18 15:43:20 +08:00
@sujin190 在 CPython 虚拟机里,是按照字节码来逐个执行的。对于一个单进程 CPython 程序来说,字节码层面的原子性就足够了,CPU 级别的才是没有意义。
est
2021-10-18 15:48:59 +08:00
@Trim21 赋值都不安全?看来我孤陋寡闻了。233
sujin190
2021-10-18 15:52:35 +08:00
@abersheeran #16 但这个实现没啥现实意义啊,CPU 级 CAS 的价值是在多核中,CAS 可以通过占用少量 CPU 时间来换取通过更重度的锁来导致线程休眠切换调度的问题,同时还可以最大限度保护内核缓存失效的问题,毕竟现代 cpu 和缓存速度太快了,但是你在 Python 层面做一个这东西似乎啥都没解决吧,没啥意义确实没啥提供的必要
abersheeran
2021-10-18 15:55:29 +08:00
@sujin190 为了 CAS 而上 CAS 的人还是挺多的,毕竟是吹嘘的资本,尽管在他们手里几乎解决不了任何实际问题。
sujin190
2021-10-18 15:55:36 +08:00
@est #17 最简单一条赋值语句一般有三条 bytecode 组成,单条 bytecode 是线程安全的,多条之间不是,你可以用 dis 显示下编译出的 bytecode 就知道了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/808500

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX