详解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中执行shell的两种方法总结
Jan 10 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
opencv python 2D直方图的示例代码
Jul 20 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python3.6生成器yield用法实例分析
Aug 23 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
Pandas时间序列:时期(period)及其算术运算详解
Feb 25 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
python - timeit 时间模块
Apr 06 Python
Django drf请求模块源码解析
Jun 08 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 include,include_once,require,require_once
2008/09/05 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
2013/06/24 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
Javascript调用C#代码
2011/01/17 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
python自动格式化json文件的方法
2015/03/11 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
店铺转让协议书(2014版)
2014/09/23 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
导游词之潮音寺
2019/09/26 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js