详解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中使用SQLite的简单教程
Apr 29 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
Python3几个常见问题的处理方法
Feb 26 Python
django-allauth入门学习和使用详解
Jul 03 Python
解决python 读取excel时 日期变成数字并加.0的问题
Oct 08 Python
Python一行代码解决矩阵旋转的问题
Nov 30 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
Python 多线程之threading 模块的使用
Apr 14 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
Python解析json代码实例解析
2019/11/25 Python
什么是python的自省
2020/06/21 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
Python文件操作的面试题
2013/06/22 面试题
高中生校园生活自我评价
2013/09/19 职场文书
业务员岗位职责范本
2013/12/15 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
经费申请报告范文
2015/05/18 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
假期读书倡议书3篇
2019/08/19 职场文书