详解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使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
pandas 时间格式转换的实现
Jul 06 Python
linux环境中没有网络怎么下载python
Jul 07 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python palywright库基本使用
Jan 21 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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
对javascript和select部件的结合运用
2006/10/09 PHP
php中iconv函数使用方法
2008/05/24 PHP
用PHP读取RSS feed的代码
2008/08/01 PHP
php实现的二分查找算法示例
2017/06/20 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
javaScript基础详解
2017/01/19 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
python中实现定制类的特殊方法总结
2014/09/28 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
详解python中list的使用
2019/03/15 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
python编写俄罗斯方块
2020/03/13 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
python如何实现图片压缩
2020/09/11 Python
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
土木工程专业个人求职信
2013/12/30 职场文书
招聘单位介绍信
2014/01/14 职场文书
创建卫生先进单位实施方案
2014/03/10 职场文书
个人委托函范文
2015/01/29 职场文书
北京故宫导游词
2015/01/31 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
机关单位保密工作责任书
2015/05/11 职场文书