前言:

上vip课的时候每次讲到框架的执行,就会有好学的同学问用多线程怎么执行,然后我每次都会说在测开课程会详细讲解,这并不是套路,因为如果你不理解多线程,不清楚什么时候该用什么时候不该用,就会适得其反。今天我们就来聊一聊多线程这个烫手的山芋。

一、python执行慢的原因

1、动态类型语言,边解释边执行。

2、GIL锁无法使用多核CPU并发执行。

二、什么是GIL锁

1、全局解释器锁(Global Interpreter Lock),是计算机程序设计语言计时器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。
即使在多核CPU上,使用GIL的解释器也只允许同一时间执行一个线程。

2、你可以理解为这是python设计上的一个Bug,但是因为重构成本太高,龟叔也没打算修复了。

3、那么多线程就没有用了吗?当然不是,多线程可以用于IO密集型任务。

三、CPU密集型

阿里云开发者社区的解释:CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。

说人话:做某件事情的时候CPU很忙,磁盘/内存读取很闲,这个事情就叫CPU密集型任务。

四、IO密集型

阿里云开发者社区的解释:IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。

说人话:做某件事情的时候磁盘/内存读取很忙,CPU很闲,这个事情就叫IO密集型任务。

五、什么是多线程

百度百科的解释:多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。

六、多线程使用场景

1、用于IO密集型任务

七、进入主题上代码

import requests
import time
import threading#干活函数,请求测试派,其他的啥都不干
def get_url(url):requests.get(url=url)#单线程实现,访问测试派50次
def single(url):for i in range(50):get_url(url)#多线程实现,访问测试派50次
def create_multi(url):threads = []for i in range(50):#创建子线程th = threading.Thread(target=get_url,args=(url,))threads.append(th)#启动子线程for val in threads:val.start()#主线程等待子线程执行结束再结束for val in threads:val.join()if __name__ == '__main__':url = "http://testingpai.com/recent"#单线程执行时间统计start = time.time()single(url)end=time.time()print("单线程耗时:",end - start)print("="*30)#多线程执行时间统计start = time.time()create_multi(url)end=time.time()print("多线程耗时:",end - start)输出:
单线程耗时:27.86112666130066
==============================
多线程耗时: 19.54499316215515

►►► 多线程的创建方式

上面我们讲了多线程的使用场景,通过一个简单的例子了解了多线程在IO密集型任务中确实能提高代码执行效率,接下来我们聊一聊多线程的创建。

一、实例化Thread类创建

import requests
import threading#干活函数,请求测试派,其他的啥都不干
def get_url(url):requests.get(url=url)if __name__ == '__main__':url = "http://testingpai.com/recent"threads = []for i in range(50):#创建子线程th = threading.Thread(target=get_url,args=(url,))threads.append(th)#启动子线程for val in threads:val.start()#主线程等待子线程执行结束再结束for val in threads:val.join()

二、继承Thread重写run方法创建

import requests
import threadingclass TestThreading(threading.Thread):def __init__(self):#调用父类初始化函数进行必要的初始化super().__init__()#重写run方法def run(self):thread_name = threading.current_thread().namethread_id = threading.current_thread().identprint('子线程id={},子线程名称={}:'.format(thread_id, thread_name))print("干活的函数逻辑写在这里")res = requests.get(url="http://testingpai.com/recent")print(res)if __name__ == '__main__':#启动子线程for i in range(3):th = TestThreading()th.start()

最后: 如果你平时有很多问题想要解决,你的测试职业规划也需要一点光亮,你也想跟着大家一起分享探讨,我给你推荐一个 「软件测试学习交流群:746506216」 你缺的知识这里有,你少的技能这里有,你要的大牛也在这里……


资源分享【这份资料必须领取~】

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

总结的太到位:python 多线程系列详解相关推荐

  1. Python爬虫——Python多线程爬虫详解

    网络爬虫程序是一种 IO 密集型程序,程序中涉及了很多网络 IO 以及本地磁盘 IO 操作,这些都会消耗大量的时间,从而降低程序的执行效率,而 Python 提供的多线程能够在一定程度上提升 IO 密 ...

  2. Python多线程编程详解,文章比较长,需耐心浏览

    文章目录 前言 创建多线程 守护线程 线程实例 零基础Python学习资源介绍 一.Python所有方向的学习路线 二.Python学习软件 三.Python入门学习视频 四.Python练习题 五. ...

  3. Python 装饰器详解(中)

    Python 装饰器详解(中) 转自:https://blog.csdn.net/qq_27825451/article/details/84581272,博主仅对其中 demo 实现中不适合pyth ...

  4. Python字符编码详解

    Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...

  5. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  6. windows上安装Anaconda和python的教程详解

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  7. python安装教程windows-windows上安装Anaconda和python的教程详解

    一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...

  8. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  9. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

最新文章

  1. ROS 安装kinect驱动+测试
  2. CPPUNIT的安装和编译
  3. 终于弄明白 i = i++和 i = ++i 的区别了!
  4. Android鬼点子 CircleProgressView
  5. Web服務器的配置方法
  6. python控制台编写_Python:为控制台prin编写unittest
  7. linux rtl8723bu 蓝牙,RTL8723DS蓝牙问题分析
  8. Android 显示软键盘输入法和强制隐藏软键盘输入法
  9. python中天天向上的力量实例
  10. 用Python把它做出来:EXCEL文件合并/拆分工具 (含VBA版)
  11. kvm最多能管几台服务器,高效管理500台服务器的kvm切换器配置方案
  12. golang学习之negroni/gizp源码分析
  13. stm32 学习--Stm32F407 SPI1 全双工DMA 收发数据
  14. IBM x3690 x5服务器安装Debian Linux
  15. windows手机改为Android,如何在平板电脑上把windows系统变成安卓系统
  16. 21天战拖记——Day21:《小强升职记》学习感受(2014-05-24)
  17. 凤凰系统的服务器搭建,凤凰系统装在云服务器
  18. Squid 代理服务
  19. 数据库的隔离级别介绍
  20. 我的Python学习笔记:私有变量

热门文章

  1. 程序员--经典10道脑力题
  2. echarts如何将柱形图的柱子分割成一小块一小块,也就是象形柱图
  3. 爬虫:python爬取简历模板
  4. 集合位置(洛谷 P1491)
  5. win7系统安装高版本的node教程
  6. android 界面大小设置在哪里,移动应用界面设计的尺寸设置及规范
  7. 真正的IT女是什么样子的?
  8. 我的2013----IT女的一年经历
  9. 结构建模设计——Solidworks软件之特征成型中异形孔向导和线性阵列功能实战总结
  10. C#、打开basler相机