详解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错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
Python中的迭代器漫谈
Feb 03 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
spyder常用快捷键(分享)
Jul 19 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
Aug 01 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
python3.x中安装web.py步骤方法
Jun 23 Python
Python基础之元编程知识总结
May 23 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输出1000以内质数(素数)示例
2014/02/16 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Python的缺点和劣势分析
2019/11/19 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
交通法规咨询中心工作职责
2013/11/27 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
求职自我评价范文
2015/03/09 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
美丽的大脚观后感
2015/06/03 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
pytest配置文件pytest.ini的详细使用
2021/04/17 Python
python脚本框架webpy模板赋值实现
2021/11/20 Python