详解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 相关文章推荐
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
Fabric 应用案例
Aug 28 Python
Python获取文件所在目录和文件名的方法
Jan 12 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
python自动化生成IOS的图标
Nov 13 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
Python基于requests实现模拟上传文件
Apr 21 Python
Python如何给你的程序做性能测试
Jul 29 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 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/04/24 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
javascript 清除输入框中的数据
2009/04/13 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
英国豪华针织品牌John Smedley的在线销售商:The Outlet by John Smedley
2018/04/08 全球购物
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
青年文明号复核材料
2014/02/11 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
党员违纪检讨书
2015/05/05 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书