python的list和dict是否是线程安全的讨论
来源:互联网 发布:自己开淘宝店怎么发货 编辑:程序博客网 时间:2024/06/15 21:12
在 今天code一个python的多线程代码,因为需要多个线程共享同一个dict,遇到一个困惑,就是dict是否是线程安全的,去华莽里面查了下,发现有大牛在讨论,因此记录下,具体还需要我去进一步验证下:
twisted的代码中,是把dict和list当做线程安全来使用的,但是dict和list在jython中不是线程案全的,所以twisted特别针对jython环境做了线程安全处理。
上次对于这个问题,特别向Robert Chen 请教过,以下引用Robert Chen回复邮件中的部分内容:
我不知道你的"线程安全"的具体定义是什么? 我分两种情况说一下吧。
1、list的任何操作的行为应该都是确定的,比如下面的代码 lst = [] lst[0] = 1
Python虚拟机执行的对应的字节码序列为:
LOAD_CONST 1 (1)LOAD_FAST 0 (lst)LOAD_CONST 2 (0)STORE_SUBSCR
发生存数据的操作在STORE_SUBSCR字节码,这里需要明确的是Python虚拟机的线程调度,或者说中断机制,是以字节码为粒度的,就是说,一个字节码操作可以认为是原子操作,所以STORE_SUBSCR即使在多线程的环境下也不会被中断,它能顺利地完成,所以,list的任何操作的行为都是确定的
2、list的操作序列的行为可能是不确定的,比如下面的代码:
lst = []thread 1:lst[0] = 1thread 2:lst[0] = 2print lst[0]
thread 2中的print lst[0]的行为可能就是不确定的了。有两种可能性:
1、thread 1先执行了"lst[0] = 1",然后被中断,Python虚拟机切换到thread 2,执行"lst[0] = 2,print lst[0]"两条语句,那么打印输出的结果自然是2
2、thread 2先执行了"lst[0] = 2",然后被中断,Python虚拟机切换到thread 1,执行了"list[0] = 1",然后中断再次发生,Python虚拟机切换到thread 1,执行print lst[0],这时的输出结果就应该是1,从thread 2的角度来看,这个结果就诡异了
- python的list和dict是否是线程安全的讨论
- python的list和dict是否是线程安全的讨论
- Python中list和dict的复制
- python list和dict的遍历
- servlet是否是线程安全的
- Servlet是否是线程安全的
- 6.python的set、list和dict的解析
- python的list,dict,tuple比较和应用
- python的list,dict,tuple比较和应用
- python的list,dict,tuple比较和应用
- python的list,dict,tuple比较和应用
- python中list 和 dict 效率的一次实践
- Python列表(list)和字典(dict)的操作方法
- Python中list,tuple,dict,set的区别和用法
- Python中list,tuple,dict,set的区别和用法
- Python中list,tuple,dict,set的区别和用法
- 线程安全/不安全的讨论
- SessionFactory和Session的线程安全的讨论
- 加入sqlite开发库
- Win7系统在IIS7中重新注册.netframework
- linux下编写播放DVD的软件相关库
- Makefile学习笔记
- connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)
- python的list和dict是否是线程安全的讨论
- Centos5.4虚拟机安装
- 开源 Android pdf 阅读器开发总结
- QT容器类(三) 之 QMap、QHash
- zygote和system_server分析
- 巴斯达叔叔犹豫又结巴的电影说
- eclipse工程中classpath的信息
- 基于AForge的视频视图
- 通过流方式导出文件,防止文件名中文乱码