10

Python 中 有 CAS 的实现吗

 2 years ago
source link: https://www.v2ex.com/t/808500
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Python

Python 中 有 CAS 的实现吗

  monetto · 19 小时 41 分钟前 · 2050 次点击

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

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

36 条回复    2021-10-19 00:33:49 +08:00

dqzcwxb

dqzcwxb   19 小时 2 分钟前

等一个莫名其妙喷 java 的
不过也有可能没有,因为 cas 不多学点 java 还真不知道是什么

Goat121

Goat121   18 小时 50 分钟前

@dqzcwxb java 被喷不是语言的问题,正是因为你这种 java boy 太多,让我等羞于为伍,说自己写过几年 java 都心惊胆战怕被人误认为你们。
cas 和 java 又有什么关系了?人家实现 cas 的时候还没现代操作系统呢,你家 jvm 都没地方跑谢谢。

dqzcwxb

dqzcwxb   17 小时 59 分钟前

@Goat121 #2 "等一个莫名其妙喷 java 的"你可真会咬钩
我没说 cas 跟 java 有关系,只是某些喷 java 的喜欢带上
同理设计模式也跟 java 没啥关系,还不是天天喷 java 设计模式滥用?
还羞与为伍,笑死

BBCCBB

BBCCBB   17 小时 52 分钟前

没发现有, python 单进程的, 直接用 Lock().

janxin

janxin   17 小时 50 分钟前

@dqzcwxb ???为什么喷 Java 要带上 CAS 啊,你说设计模式我还能理解

est

est   17 小时 38 分钟前

没有而且不需要。因为 GIL 直接保证了同步。

monetto

monetto   17 小时 33 分钟前

@est GIL 不等于线程安全,GIL 不保证线程变量同步。

dqzcwxb

dqzcwxb   17 小时 0 分钟前

@janxin #5 设计模式不是 java 独有的,也不是 java 发明
cas 不是 java 独有的,也不是 java 发明

securityCoding

securityCoding   16 小时 58 分钟前

设计模式跟语言无关 , 基本上有点名气的开源项目里面都是设计模式的影子在里面

stach

stach   16 小时 8 分钟前

Python 一般我都用 Lock() 来确保类似 i += 1 这种操作的原子性, 之前查找资料有实现原子性的一些库, 不过没用过.

ipwx

ipwx   15 小时 57 分钟前

Python 的 CAS 将是一场灾难啊。。。GIL 把一个忙等待的线程切了进来。。。

Trim21

Trim21   15 小时 56 分钟前

@est #6 保证不了,不说 if 和赋值之间会不会切线程,就是赋值也不一定安全

sujin190

sujin190   15 小时 39 分钟前

CAS 是 cpu 指令级提供的冲突处理的,python 一个+1 操作都好多条 cpu 指令了,这个在 python 层面上来看已经毫无意义了吧

abersheeran

abersheeran   15 小时 33 分钟前   ❤️ 1

比较难想象 Python 怎么 CAS,l.a = b 不是原子的,这要变成三条字节码,两个 LOAD_NAME 和一个 STORE_NAME 。
如果直接用 a = b,那你压根拿不到 a 的结果,因为 Python 没有指针,函数里赋值过去就没了。
如果用 nonlocal global 去修复拿结果的问题,那就没办法做到无副作用,而且这只是换了个 name,对象所在的内存还是没有变化。

综上所述,建议直接 threading.Lock,不会有人上了 Python 还扣这个锁的性能吧?大可不必啊

abersheeran

abersheeran   15 小时 31 分钟前

@sujin190 在 CPython 虚拟机里,是按照字节码来逐个执行的。对于一个单进程 CPython 程序来说,字节码层面的原子性就足够了,CPU 级别的才是没有意义。

est

est   15 小时 25 分钟前

@Trim21 赋值都不安全?看来我孤陋寡闻了。233

sujin190

sujin190   15 小时 22 分钟前   ❤️ 1

@abersheeran #16 但这个实现没啥现实意义啊,CPU 级 CAS 的价值是在多核中,CAS 可以通过占用少量 CPU 时间来换取通过更重度的锁来导致线程休眠切换调度的问题,同时还可以最大限度保护内核缓存失效的问题,毕竟现代 cpu 和缓存速度太快了,但是你在 Python 层面做一个这东西似乎啥都没解决吧,没啥意义确实没啥提供的必要

abersheeran

abersheeran   15 小时 19 分钟前

@sujin190 为了 CAS 而上 CAS 的人还是挺多的,毕竟是吹嘘的资本,尽管在他们手里几乎解决不了任何实际问题。

sujin190

sujin190   15 小时 19 分钟前

@est #17 最简单一条赋值语句一般有三条 bytecode 组成,单条 bytecode 是线程安全的,多条之间不是,你可以用 dis 显示下编译出的 bytecode 就知道了

sujin190

sujin190   15 小时 14 分钟前

@abersheeran #19 确实了,Python 上 CAS 确实是为了 CAS 而 CAS 了,毕竟 GIL 限制了,不过如果你搞个扩展释放掉 GIL 的话就可以搞了

sampeng

sampeng   14 小时 58 分钟前

看完讨论。。我以为是 CAS 单点登录,我还纳闷这有啥好讨论的。。。落伍了落伍了

fgwmlhdkkkw

fgwmlhdkkkw   14 小时 57 分钟前

搜 atomic 好像有几个,试试看?

woctordho

woctordho   14 小时 11 分钟前   ❤️ 1

我还以为是 computer algebra system,差点开始安利 SageMath (

abersheeran

abersheeran   14 小时 5 分钟前

@sujin190 搞扩展那也是别的语言了,一般是 C,C 的 CAS 这资料还不到处都是,可以说跟 Python 一点关系都没有了。哈哈哈。

yunluw

yunluw   10 小时 17 分钟前   ❤️ 1

此贴前三楼以自己为示范展示了不加控制的人类本性

dingwen07

dingwen07   9 小时 24 分钟前 via iPhone

点击来之前以为是计算机代数系统

guoli100

guoli100   8 小时 38 分钟前

@dingwen07 我第一眼也以为是说计算机代数系统

2i2Re2PLMaDnghL

2i2Re2PLMaDnghL   8 小时 34 分钟前

@securityCoding 设计模式的影子就不叫设计模式。设计模式的全部想法都是在(拙劣、错误且反思考地)尝试提取习惯性操作并为之取个名字。
你这就好比大多数语言给 a=1 取个名字叫「赋值」,然后说『( Haskell 的) let a=1 in ... 有赋值的影子』,这说明你被词汇和词义限制住了思想。

Hstar

Hstar   8 小时 23 分钟前

据我所知,Python 只有.append() 是 aotmic 的,有点小坑但是有 GIL 了

imycc

imycc   8 小时 13 分钟前

恕我孤陋寡闻,python 确保线程安全的一般手段应该就是 threading.Lock,还真没见过其他方式

Jooooooooo

Jooooooooo   8 小时 3 分钟前

@dqzcwxb 有毒. 楼主完全没提 java 你 1L 莫名其妙来个喷 Java?

future0906

future0906   6 小时 54 分钟前

@Trim21 不是,你就好好学学啥是 GIL 。threading.Lock 主要是保证 PythonVM 外的临界区的。

Trim21

Trim21   6 小时 41 分钟前

你可以直接说你想表达的东西

Trim21

Trim21   6 小时 40 分钟前

@future0906 #34 你可以直接说你想表达的东西

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK