详解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获取网页上图片下载地址的方法
Mar 11 Python
python实现用户登录系统
May 21 Python
Python 类的继承实例详解
Mar 25 Python
Python MD5加密实例详解
Aug 02 Python
python 输出上个月的月末日期实例
Apr 11 Python
python中itertools模块zip_longest函数详解
Jun 12 Python
Python实现语音识别和语音合成功能
Sep 20 Python
python getopt模块使用实例解析
Dec 18 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
python selenium xpath定位操作
Sep 01 Python
python 解决函数返回return的问题
Dec 05 Python
Python多个MP4合成视频的实现方法
Jul 16 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加MYSQL服务器
2006/10/09 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
php进程间通讯实例分析
2016/07/11 PHP
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
python文件的md5加密方法
2016/04/06 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
深入了解NumPy 高级索引
2020/07/24 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
HEMA英国:荷兰原创设计
2018/08/28 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
酒店总经理欢迎词
2014/01/15 职场文书
电话客服工作职责
2014/07/27 职场文书
论文致谢词范文
2015/05/14 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
热爱劳动主题班会
2015/08/14 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
Python实现生成bmp图像的方法
2021/06/13 Python
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript