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 操作

>>> import dis

>>> def test_remove():

... a = [1]

... a.remove(0)

...

>>> dis.dis(test_remove)

2 0 LOAD_CONST 1 (1)

2 BUILD_LIST 1

4 STORE_FAST 0 (a)

3 6 LOAD_FAST 0 (a)

8 LOAD_ATTR 0 (remove)

10 LOAD_CONST 2 (0)

12 CALL_FUNCTION 1

14 POP_TOP

16 LOAD_CONST 0 (None)

18 RETURN_VALUE

从上面不难看出,整个 remove 操作被分成了好几条指令,这就意味着在多线程情况下会出现错乱的情况,试想一下,如果多线程下都去 remove 列表的话,并且不按照顺序,很容易出现问题。

append

在最上面我们说到,list 的append操作是线程安全的,那么究竟是为什么呢?我们同样来用 dis 查看一下

8 19 LOAD_GLOBAL 0 (a)

22 LOAD_ATTR 2 (append)

25 LOAD_CONST 2 (1)

28 CALL_FUNCTION 1

31 POP_TOP

这里显然,append 也是有几条指令,势必在多线程执行的情况下也会发生交错,但是对于多线程下我们操作append, 我们肯定也不会在乎这个时候 list到顺序问题了,所以我们说它的 append 是线程安全的

参考

以上就是详解Python多线程下的list的详细内容,更多关于Python多线程下的list的资料请关注脚本之家其它相关文章!

python多线程操作列表_详解Python多线程下的list相关推荐

  1. python从random生成列表_详解Python利用random生成一个列表内的随机数

    详解Python利用random生成一个列表内的随机数 首先,需要导入random模块: import random 随机取1-33之间的1个随机数,可能重复: random.choice(range ...

  2. python线程延时函数_详解Python 多线程 Timer定时器/延迟执行、Event事件

    Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...

  3. python操作目录_详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...

  4. python提取hbase数据_详解python操作hbase数据的方法介绍

    配置 thrift python使用的包 thrift 个人使用的python 编译器是pycharm community edition. 在工程中设置中,找到project interpreter ...

  5. python变量定义大全_详解python变量与数据类型

    这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...

  6. python模块搜索原则_详解python模块路径查找规则及定义

    在python中创建一个模块非常简单,只需要在当前目录下创建一个 .py文件即可,系统自动将其解析成模块,文件名就是模块名.很多我们源码时代的同学都认为在查找模块时优先使用当前目录下的自定义模块.其实 ...

  7. python装饰器由浅入深_详解Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  8. python实现日历功能_详解Python日历模块的使用

    calendar模块的函数都是日历相关的,提供了对日期的一些操作方法,和生成日历的方法. calendar模块中提供了三大类: 一.calendar.Calendar(firstweekday=0) ...

  9. python提取邮件附件_详解python实现读取邮件数据并下载附件的实例

    详解python实现读取邮件数据并下载附件的实例 实现结果图: 实现代码: #!/usr/bin/python2.7 # _*_ coding: utf-8 _*_ """ ...

最新文章

  1. 突破微信小程序五层层级限制的解决方案
  2. Python基础12-常用的内置函数
  3. IntelliJ IDEA 最常用配置,应用、永久激活
  4. 织入业务代码-LogAspect
  5. 7-113 堆栈操作合法性 (20 分)
  6. bzoj5406: Gift
  7. 切换回Chrome上的上次标签及打开设置快捷键
  8. Eclipse编译去除svn文件夹
  9. iOS中关于文件操作
  10. Zookeeper 集群的安装与部署
  11. 100位量子计算机算力,量子算力争霸再迎赛点:谷歌称瞄准新纪录!
  12. 安装phpcs和php-cs-fixer
  13. iOS PayPal集成和使用
  14. IC 短缺的影响超出汽车领域
  15. CSS设置表格行列,给bootstrap table设置行列单元格样式
  16. 计算机毕业设计Python+uniapp基于微信小程序某企业考勤系统(小程序+源码+LW)
  17. 助力绵阳市商业银行,打造高效项目生命周期管理平台
  18. 英语 | Day19、20 x 句句真研每日一句(去修饰、嵌套)
  19. 混合动力汽车SIMULINK整车模型,并联P2构型,基于规则的控制策略,模型运行及仿真无误
  20. python中的del含义

热门文章

  1. 数据结构与算法 pdf_整理一个月完成的数据结构与算法PDF和测试代码免费拿
  2. 计算机简单故障时的排除方法,电脑简单故障排除解决办法大全
  3. Python - Excel文件与CSV文件相互转化
  4. 还在用Tensorboard?机器学习实验管理平台大盘点
  5. 论文浅尝 | 问题生成(QG)与答案生成(QA)的结合
  6. Windows10 virtualbox安装alpine+docker
  7. MongoDB安装启动教程
  8. cacls查看文件权限
  9. 基于类的命令行notebook的实现
  10. ICSharpCode.SharpZipLib 开源压缩库使用示例