V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
RicardoScofileld
V2EX  ›  Python

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

  •  
  •   RicardoScofileld · 2018-03-26 11:15:04 +08:00 · 8842 次点击
    这是一个创建于 2463 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    @holajamc 懂了 (逃
    yuqaf
        6
    yuqaf  
       2018-03-26 14:43:21 +08:00
    @jmc891205 只要不是一条指令,完成所有步骤有 GIL 也没用。。
    scriptB0y
        7
    scriptB0y  
       2018-03-26 15:02:56 +08:00
    同意 1L,修改共享变量的时候都要加锁。
    misaka19000
        8
    misaka19000  
       2018-03-26 15:17:55 +08:00 via Android
    我知道 quque 是线程安全的
    xpresslink
        9
    xpresslink  
       2018-03-27 12:33:06 +08:00
    是不是安全的只要的用 dis 模块看一下字节码就明白了。字节码的每一行就是一个原子操作,多线程切换就是原子操作为单位的,只要一个操作需两行字节码的就不是线程安全的。
    brokensword
        10
    brokensword  
       2019-01-09 17:32:46 +08:00
    @holajamc 为什么代码运行的结果是线程安全的.......
    jpch89
        11
    jpch89  
       2019-02-15 10:46:51 +08:00
    @brokensword 把操作次数增加到十万次(如果不够增加到一百万次),就会发现不是线程安全的。
    happyxhw
        12
    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
        13
    happyxhw  
       2020-06-02 11:57:25 +08:00
    @happyxhw dict 也是一样的,dict 的 pop,add 等操作都是线程安全的,这和 go 里面的 map 不一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   884 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:02 · PVG 04:02 · LAX 12:02 · JFK 15:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.