详解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中的类学习笔记
Sep 23 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
Sanic框架安装与简单入门示例
Jul 16 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
python进程和线程用法知识点总结
May 28 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
python编程的核心知识点总结
Feb 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
Yii使用技巧大汇总
2015/12/29 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
详解Javascript 装载和执行
2014/11/17 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
angularjs下拉框空白的解决办法
2017/06/20 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
恶意软件的定义
2014/11/12 面试题
二年级评语大全
2014/04/23 职场文书
2015年安全月活动总结
2015/03/26 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL