详解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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
Python中解析JSON并同时进行自定义编码处理实例
Feb 08 Python
Python itertools模块详解
May 09 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
python数据类型_字符串常用操作(详解)
May 30 Python
Python日期的加减等操作的示例
Aug 15 Python
python3 property装饰器实现原理与用法示例
May 15 Python
Python编程中类与类的关系详解
Aug 08 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
学python需要去培训机构吗
Jul 01 Python
Python编写单元测试代码实例
Sep 10 Python
python爬虫线程池案例详解(梨视频短视频爬取)
Feb 20 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隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
List the Codec Files on a Computer
2007/06/18 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
python中list常用操作实例详解
2015/06/03 Python
Python理解递归的方法总结
2019/01/28 Python
Python json读写方式和字典相互转化
2020/04/18 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
财务助理岗位职责
2013/11/10 职场文书
高二历史教学反思
2014/01/25 职场文书
质量主管工作职责
2014/09/26 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
活动简报范文
2015/07/22 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers