详解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中遍历文件的3个方法
Sep 02 Python
python实现封装得到virustotal扫描结果
Oct 05 Python
python实现学生信息管理系统
Apr 05 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
python如何将两个txt文件内容合并
Oct 18 Python
python实现滑雪游戏
Feb 22 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Python短信轰炸的代码
Mar 25 Python
基于pycharm实现批量修改变量名
Jun 02 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 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正则校验用户名介绍
2008/07/19 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
PHP针对JSON操作实例分析
2015/01/12 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
Prototype Class对象学习
2009/07/19 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
详解Vue.js分发之作用域槽
2017/06/13 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python使用matplotlib填充图形指定区域代码示例
2018/01/16 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
电脑教师的自我评价
2013/12/18 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
投诉信回复范文
2015/07/03 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers