V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Mar 26, 2018 · 9626 views
    This topic created in 2967 days ago, the information mentioned may be changed or developed.

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

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

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

    so …… GG
    jmc891205
        5
    jmc891205  
       Mar 26, 2018
    @BBCCBB 打脸总是来的那么快 (哭哭

    @holajamc 懂了 (逃
    yuqaf
        6
    yuqaf  
       Mar 26, 2018
    @jmc891205 只要不是一条指令,完成所有步骤有 GIL 也没用。。
    scriptB0y
        7
    scriptB0y  
       Mar 26, 2018
    同意 1L,修改共享变量的时候都要加锁。
    misaka19000
        8
    misaka19000  
       Mar 26, 2018 via Android
    我知道 quque 是线程安全的
    xpresslink
        9
    xpresslink  
       Mar 27, 2018
    是不是安全的只要的用 dis 模块看一下字节码就明白了。字节码的每一行就是一个原子操作,多线程切换就是原子操作为单位的,只要一个操作需两行字节码的就不是线程安全的。
    brokensword
        10
    brokensword  
       Jan 9, 2019
    @holajamc 为什么代码运行的结果是线程安全的.......
    jpch89
        11
    jpch89  
       Feb 15, 2019
    @brokensword 把操作次数增加到十万次(如果不够增加到一百万次),就会发现不是线程安全的。
    happyxhw
        12
    happyxhw  
       Jun 2, 2020
    1 、list 自己是线程安全的,所以 list.pop(),list.append(),len(list) 等都是线程安全的;
    2 、list 里面的数据不一定是线程安全的,比如 list[0] += 1 就不是线程安全的,这是因为 v += 1 本身就不是原子的,这和 list 无关,反之如果 v += 1 是原子的,那么 list[0] += 1 也是线程安全的;
    happyxhw
        13
    happyxhw  
       Jun 2, 2020
    @happyxhw dict 也是一样的,dict 的 pop,add 等操作都是线程安全的,这和 go 里面的 map 不一样
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3795 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 00:48 · PVG 08:48 · LAX 17:48 · JFK 20:48
    ♥ Do have faith in what you're doing.