python列表是线程安全的吗_python的list和dict是否是线程安全的讨论

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值