您的位置:首页 > 编程语言 > Python开发

python的list和dict是否是线程安全的讨论

2014-10-20 20:21 267 查看


python的list和dict是否是线程安全的讨论

分类: python2014-01-02
14: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的角度来看,这个结果就诡异了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: