详解Python多线程下的list


Posted in Python onJuly 03, 2020

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)

有时候一次运行并不一定就会出错,多次重试之后会出现类似下面的错误

详解Python多线程下的list

很显然这种操作方式不具有普适性,如果要是欧气太强,说不定会一直不出现异常。

那么出了这种方式,有没有比较简单有效的方法吗?答案是有的

dis

dis 库是 Python 自带的一个库,可以用来分析字节码。这里我们需要有这样的认识,字节码的每一行都是一个原子操作,多线程切换就是以原子操作为单位的,如果一个操作需要两行字节码就说明它是线程不安全的

remove

这里我们先看一下上面 listremove 操作

>>> 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 是线程安全的

参考

https://stackoverflow.com/questions/6319207/are-lists-thread-safe/19728536#19728536

https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe

以上就是详解Python多线程下的list的详细内容,更多关于Python多线程下的list的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中的多行注释文档编写风格汇总
Jun 16 Python
深入理解Python对Json的解析
Feb 14 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
python实现贪吃蛇游戏
Mar 21 Python
Python函数中不定长参数的写法
Feb 13 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
Nov 16 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 Python
Python 字符串池化的前提
Jul 03 #Python
Pycharm打开已有项目配置python环境的方法
Jul 03 #Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 #Python
windows支持哪个版本的python
Jul 03 #Python
Django Form设置文本框为readonly操作
Jul 03 #Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 #Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 #Python
You might like
调整PHP的性能
2013/10/30 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
老生常谈onBlur事件与onfocus事件(js)
2016/07/09 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
python实现发送和获取手机短信验证码
2016/01/15 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
python向图片里添加文字
2019/11/26 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
python爬虫请求头的使用
2020/12/01 Python
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
最新自我评价范文
2013/11/16 职场文书
装饰活动策划方案
2014/02/11 职场文书
安全生产专项整治方案
2014/05/06 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
Nginx快速入门教程
2021/03/31 Servers
Redis Lua脚本实现ip限流示例
2022/07/15 Redis