总结的太到位:python 多线程系列详解
前言:
上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 threading
class TestThreading(threading.Thread):
def __init__(self):
#调用父类初始化函数进行必要的初始化
super().__init__()
#重写run方法
def run(self):
thread_name = threading.current_thread().name
thread_id = threading.current_thread().ident
print('子线程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编写基于socket的非阻塞多人聊天室程序(单线程&多线程)
- Why does Python's eval(input("Enter input: ")) change input's datatype?
- 总结的太到位:python 多线程系列详解
- Python怎么就火起来了?学会python可以做的兼职
- 转行学Python好找工作吗?
- 如何快速学习python,学好python?能通过Python赚到的第一笔钱,有哪些经验可以分享吗?
- 中途转行python?怎么学?没有基础的我30了自学Python转行靠谱吗?
- python threading 模块多线程详解
- python之字符串格式化(format)
- 聊聊Python中的多进程和多线程
- 基于python的每日固定时间执行实例解析
- Python 网络编程之过多线程在两个单独的 GUI 之间进行通信(教程含完整源码)
- Python 实现被动收入教程之我如何使用 python 制作我的第一个高级telegram机器人
- python多线程技术(三)
- Python搭建编程环境-安装Pycharm开发工具
- tensorflow1.x——如何在python多线程中调用同一个session会话
- Python基础之:Python中的IO
- Mysql学习---Python操作Mysql 1231
- visual studio code 里调试运行 Python代码
- 【Python基础】如何向 google colab 上传文件?
- python:多线程
- 字符串匹配的KMP算法——Python实现
- Python雪花代码
- python爬虫之多线程threading、多进程multiprocessing、协程aiohttp 批量下载图片
- 【Python】排序你学废了吗,茴香豆有四种写法,排序有十种写法
- [Python]2分钟完成python + Selenium Web端自动化环境搭建,开启~~~
- Python筛选素数
- [python] lambda匿名函数