python的list和dict是否是线程安全的讨论
2014-10-20 20:21
267 查看
python的list和dict是否是线程安全的讨论
分类: python2014-01-0214:48 682人阅读 评论(0) 收藏 举报
在 今天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] = 1 thread 2: lst[0] = 2 print 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 中的None以及 == 与 is 的区别,以及判断某个list或者dict元素是否为None
- python: 判断tuple、list、dict是否为空的方法
- Python 内置类型 dict, list,线程安全吗?
- python中dict和list排序
- Python中list、tuple、dict区别
- python的list,dict,tuple比较和应用
- 列表(list)和字典(dict)数据排序 Python
- python的list,dict,tuple比较和应用
- 【Python学习笔记】list/dict对象复制的误区与正确方法
- python判断list是否为空
- python基础31[list+tuple+set+dict+str+file的成员方法]
- Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
- python中判断list是否为空
- python学习五 列表(list)、字典(dict)、字符串(string)
- python中列表(list)和字典(dict)数据排序
- python的dict,set,list,tuple简单分析
- python中列表(list)和字典(dict)数据排序
- python判断list是否为空
- Python中list、tuple、dict 区别