详解详解Python多线程下的多线程下的list
主要介绍了Python多线程下的list的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的
朋友可以了解下
list 是 Python 常用的几个基本数据类型之一.正常情况下我们会对 list 有增删改查的操作,显然易见不会有任何问题.那么如果我
们试着在多线程下操作list 会有问题吗?
多线程下的多线程下的 list
安全安全 or 不安全?不安全? 不安全!不安全!
通常我们说的线程安全是指针对某个数据结构的所有操作都是线程安全,在这种定义下,Python 常用的数据结构 list,dict,str 等
都是线程不安全的
尽管多线程下的 list 是线程不安全的,但是在 append 的操作下是它又是线程安全的.
如何判断线程安全呢?如何判断线程安全呢?
对于线程安全不安全,我们可以通过极端条件下去复现,从而得出结论。比如说判断 list 是否线程安全
import threading
import time
# 随意设置 count 的值,值越大错误抛出的越快
count = 1000
l = []
def add():
for i in range(count):
l.append(i)
time.sleep(0.0001)
def remove():
for i in range(count):
l.remove(i)
time.sleep(0.0001)
t1 = threading.Thread(target=add)
t2 = threading.Thread(target=remove)
t1.start()
t2.start()
t1.join()
t2.join()
print(l)
有时候一次运行并不一定就会出错,多次重试之后会出现类似下面的错误
很显然这种操作方式不具有普适性,如果要是欧气太强,说不定会一直不出现异常。
那么出了这种方式,有没有比较简单有效的方法吗?答案是有的
dis
dis 库是 Python 自带的一个库,可以用来分析字节码。这里我们需要有这样的认识,字节码的每一行都是一个原子操作,多
线程切换就是以原子操作为单位的,如果一个操作需要两行字节码就说明它是线程不安全的
remove
这里我们先看一下上面 list 的 remove 操作
评论0