python进阶(15)多线程与多进程效率测试
前言
在Python中,计算密集型任务适用于多进程,IO密集型任务适用于多线程
正常来讲,多线程要比多进程效率更高,因为进程间的切换需要的资源和开销更大,而线程相对更小,但是我们使用的Python大多数的解释器是Cpython,众所周知Cpython有个GIL锁,导致执行计算密集型任务时多线程实际只能是单线程,而且由于线程之间切换的开销导致多线程往往比实际的单线程还要慢,所以在 python 中计算密集型任务通常使用多进程,因为各个进程有各自独立的GIL,互不干扰。
而在IO密集型任务中,CPU时常处于等待状态,操作系统需要频繁与外界环境进行交互,如读写文件,在网络间通信等。在这期间GIL会被释放,因而就可以使用真正的多线程。
上面都是理论,接下来实战看看实际效果是否符合理论
练习
"""多线程多进程模拟执行效率"""
from multiprocessing import Pool
from threading import Thread
import time, math
def simulation_IO(a):
"""模拟IO操作"""
time.sleep(3)
def simulation_compute(a):
"""模拟计算密集型任务"""
for i in range(int(1e7)):
math.sin(40) + math.cos(40)
return
def normal_func(func):
"""普通方法执行效率"""
for i in range(6):
func(i)
return
def mp(func):
"""进程池中的map方法"""
with Pool(processes=6) as p:
res = p.map(func, list(range(6)))
return
def asy(func):
"""进程池中的异步执行"""
with Pool(processes=6) as p:
result = []
for j in range(6):
a = p.apply_async(func, args=(j, ))
result.append(a)
res = [j.get() for j in result]
def thread(func):
"""多线程方法"""
threads = []
for j in range(6):
t = Thread(target=func, args=(j, ))
threads.append(t)
t.start()
for t in threads:
t.join()
def showtime(f, func, name):
"""
计算并展示函数的运行时间
:param f: 多进程和多线程的方法
:param func: 多进程和多线程方法中需要传入的函数
:param name: 方法的名字
:return:
"""
start_time = time.time()
f(func)
print(f"{name} time: {time.time() - start_time:.4f}s")
def main(func):
"""
运行程序的主函数
:param func: 传入需要计算时间的函数名
"""
showtime(normal_func, func, "normal")
print()
print("------ 多进程 ------")
showtime(mp, func, "map")
showtime(asy, func, "async")
print()
print("----- 多线程 -----")
showtime(thread, func, "thread")
if __name__ == "__main__":
print("------------ 计算密集型 ------------")
func = simulation_compute
main(func)
print()
print()
print()
print("------------ IO 密集型 ------------")
func = simulation_IO
main(func)
结果

| 线性执行 | 多进程(map) | 多进程(async) | 多线程 | |
|---|---|---|---|---|
| 计算密集型 | 16.0284s | 3.5236s | 3.4367s | 15.2142s |
| IO密集型 | 18.0201s | 3.0945s | 3.0809s | 3.0041s |
结论
从表格中很明显的可以看出:
- 计算密集型任务的速度:多进程 >多线程> 单进程/线程
- IO密集型任务速度: 多线程 > 多进程 > 单进程/线程。
所以,针对计算密集型任务使用多进程,针对IO密集型任务使用多线程
python进阶(15)多线程与多进程效率测试的更多相关文章
- Python进阶:多线程、多进程和线程池编程/协程和异步io/asyncio并发编程
gil: gil使得同一个时刻只有一个线程在一个CPU上执行字节码,无法将多个线程映射到多个CPU上执行 gil会根据执行的字节码行数以及时间片释放gil,gil在遇到io的操作时候主动释放 thre ...
- python分别使用多线程和多进程获取所有股票实时数据
python分别使用多线程和多进程获取所有股票实时数据 前一天简单介绍了python怎样获取历史数据和实时分笔数据,那么如果要获取所有上市公司的实时分笔数据,应该怎么做呢? 肯定有人想的是,用一个 ...
- python爬虫之多线程、多进程+代码示例
python爬虫之多线程.多进程 使用多进程.多线程编写爬虫的代码能有效的提高爬虫爬取目标网站的效率. 一.什么是进程和线程 引用廖雪峰的官方网站关于进程和线程的讲解: 进程:对于操作系统来说,一个任 ...
- 第十章:Python高级编程-多线程、多进程和线程池编程
第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...
- python中的多线程和多进程
一.简单理解一下线程和进程 一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的.打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享) 二.python中的多线程和多进程 ...
- Python之threading多线程,多进程
1.threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) ...
- Python系列之多线程、多进程
线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程. Python的标准库提供 ...
- python爬虫之多线程、多进程、GIL锁
背景: 我们知道多线程要比多进程效率更高,因为线程存在于进程之内,打开一个进程的话,首先需要开辟内存空间,占用内存空间比线程大.这样想也不怪,比如一个进程用10MB,开10个进程就得100MB的内存空 ...
- python之路-----多线程与多进程
一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...
随机推荐
- iOS拍照之系统拍照
拍照在App中使用频次高,入门级别直接调用系统拍照 思路: 系统拍照使用UIImagePickerController 1.设置下plist,否则没权限,报错 2.判断摄像头,获取权限,否则弹出界面黑 ...
- .NET并发编程-数据并行
本系列学习在.NET中的并发并行编程模式,实战技巧 内容目录 数据并行Fork/Join模式PLINQ 本小节开始学习数据并行的概念模式,以及在.NET中数据并行的实现方式.本系列保证最少代码呈现量, ...
- Flask:基本结构
在大多数标准中,Flask 都算是小型框架,小到可以称为"微框架".但是,小并不意味着它比其他框架的功能少.Flask 自开发伊始就被设计为可扩展的框架,它具有一个包含基本服务的强 ...
- 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...
- AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…
前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量校招/社招名额开放,欢迎大家投递简历,详情见文末.为帮助大家更了解高德技术,我们策划了#春招专栏#的系列文章,组织各业务团队的高年级同 ...
- 那些你不知道的DOU+投放技巧,以及常见的审核失败原因丨国仁网络
作为小额付费投放工具,DOU+一直深受各大中小商家的青睐.虽然它的审核比较严格,但转化效果还是非常明显的. 近日,抖音发布重要公告:内容低质的视频将无法购买DOU+推广,并可能因违反平台规则导致无法观 ...
- 面试准备——计算机网络(https)
一.为什么要提出HTTPS? HTTP的缺点: 明文通信.不加密,可能被窃听. 无身份验证,可能遭遇伪装. 无法证明报文的完整性,可能被篡改. 二.HTTPS = HTTP+加密(防窃听)+认证(防伪 ...
- mysql 使用sleep操作 update 来停止一段时间执行语句 [骚操作]
update mytestTable inner join(select '2' as id, sleep(5)) a on mytestTable.id=a.id set mytestTable.n ...
- Maven基础&&Spring框架阶段常用工具类整理
常用工具类 1.密码加密工具类: package com.itheima.utils; import java.security.MessageDigest; import sun.misc.BASE ...
- 安装JDK9,jemter无法正常启动,怎么退回到JDK8
安装JDK8,配置环境变量 java -version显示的是8.1 然后安装JDK9之后,java -version显示的是9+8.1 这个时候,无法正常启动jemter 在环境变量中把path的C ...