Python 中那些数据类型是基于线程安全的?

2018-03-26 11:15:04 +08:00
 RicardoScofileld

如题,就是字符串,列表,元组等数据类型是否线程安全。

8798 次点击
所在节点    Python
13 条回复
holajamc
2018-03-26 11:30:33 +08:00
线程安全的是因为针对某一数据结构的所有操作都是线程安全的。
所以 list dict str int 都不是线程安全的。
但是有些数据结构的某些操作确实是安全的,比如 list.pop()
jmc891205
2018-03-26 13:01:26 +08:00
以我的理解 如果解释器用的是 CPython 由于 GIL 的存在 所有数据结构都是 thread safe 的
BBCCBB
2018-03-26 14:16:28 +08:00
楼上的理解是错的
holajamc
2018-03-26 14:17:09 +08:00
@jmc891205
线程 AB 同时操作 list
list 的[0]初始值为 0

线程 A 操作 100 次
list[0]+=1
线程 B 操作 100 次
list[0]+=1

so …… GG
jmc891205
2018-03-26 14:37:06 +08:00
@BBCCBB 打脸总是来的那么快 (哭哭

@holajamc 懂了 (逃
yuqaf
2018-03-26 14:43:21 +08:00
@jmc891205 只要不是一条指令,完成所有步骤有 GIL 也没用。。
scriptB0y
2018-03-26 15:02:56 +08:00
同意 1L,修改共享变量的时候都要加锁。
misaka19000
2018-03-26 15:17:55 +08:00
我知道 quque 是线程安全的
xpresslink
2018-03-27 12:33:06 +08:00
是不是安全的只要的用 dis 模块看一下字节码就明白了。字节码的每一行就是一个原子操作,多线程切换就是原子操作为单位的,只要一个操作需两行字节码的就不是线程安全的。
brokensword
2019-01-09 17:32:46 +08:00
@holajamc 为什么代码运行的结果是线程安全的.......
jpch89
2019-02-15 10:46:51 +08:00
@brokensword 把操作次数增加到十万次(如果不够增加到一百万次),就会发现不是线程安全的。
happyxhw
2020-06-02 11:52:48 +08:00
1 、list 自己是线程安全的,所以 list.pop(),list.append(),len(list) 等都是线程安全的;
2 、list 里面的数据不一定是线程安全的,比如 list[0] += 1 就不是线程安全的,这是因为 v += 1 本身就不是原子的,这和 list 无关,反之如果 v += 1 是原子的,那么 list[0] += 1 也是线程安全的;
happyxhw
2020-06-02 11:57:25 +08:00
@happyxhw dict 也是一样的,dict 的 pop,add 等操作都是线程安全的,这和 go 里面的 map 不一样

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

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

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

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

© 2021 V2EX