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的角度来看,这个结果就诡异了

0 1
原创粉丝点击