python 并发编程 多线程 GIL与多线程
GIL与多线程
有了GIL的存在,同一时刻同一进程中只有一个线程被执行
多进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势
1、cpu到底是用来做计算的,还是用来做I/O的? 2、多个cpu,意味着可以有多个核并行完成计算,所以多核提升的是计算性能,cpu越多计算性能越高 3、无论是多核还是单核CPU ,每个cpu一旦遇到I/O阻塞,仍然需要等待,所以多核对I/O操作没什么用处
CPU用来计算
结论:
1、对计算来说,cpu越多越好,但是对于I/O来说,再多的cpu也没用
2、当然对运行一个程序来说,随着cpu的增多执行效率肯定会有所提高(不管提高幅度多大,总会有所提高),这是因为一个程序基本上不会是纯计算或者纯I/O,
所以我们只能相对的去看一个程序到底是计算密集型还是I/O密集型,从而进一步分析python的多线程到底有无用武之地
假设我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
假设我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
方案一:开启四个进程
方案二:一个进程下,开启四个线程
单核情况下,分析结果:
如果四个任务是计算密集型,没有多核来并行计算,方案一徒增了创建进程的开销,方案二胜
如果四个任务是I/O密集型,方案一创建进程的开销大,且进程的切换速度远不如线程,方案二胜
现在大部分的软件都是IO密集型,所以开多线程
多核情况下,分析结果:
如果四个任务是计算密集型,多核意味着并行计算,在python中一个进程中同一时刻只有一个线程执行用不上多核,方案一胜
如果四个任务是I/O密集型,再多的核也解决不了I/O问题,方案二胜
结论:
现在的计算机基本上都是多核,python对于计算密集型的任务开多线程的效率并不能带来多大性能上的提升,甚至不如串行(没有大量切换),但是,对于IO密集型的任务效率还是有显著提升的。
多线程性能测试
如果并发的多个任务是计算密集型:多进程效率高 多进程耗时17秒
from multiprocessing import Process
import os
import time def work():
res = 0
for i in range(100000000):
res *= i if __name__ == '__main__':
l = []
print(os.cpu_count()) # 查看主机是CPU多少核
start=time.time()
for i in range(4):
p = Process(target=work) # 多进程耗时17秒
l.append(p)
p.start()
for p in l:
p.join()
stop=time.time()
print('run time is %s' %(stop-start)) '''
4核
run time is 17.621007680892944
'''
多线程耗时28秒
from threading import Thread
import os
import time def work():
res = 0
for i in range(100000000):
res *= i if __name__ == '__main__':
l = []
print(os.cpu_count()) # 查看主机是CPU多少核
start=time.time()
for i in range(4):
p = Thread(target=work) # 多线程耗时28秒
l.append(p)
p.start()
for p in l:
p.join()
stop=time.time()
print('run time is %s' %(stop-start)) '''
4核
run time is 28.117608308792114
'''
如果并发的多个任务是I/O密集型:多线程效率高
模拟IO密集型 time.sleep等待
多线程耗时2秒
线程来回切换,遇到IO切换到另外一个线程
# IO密集型:用多线程
from threading import Thread
import os
import time def work():
time.sleep(2) if __name__ == '__main__':
l = []
print(os.cpu_count())
start=time.time()
for i in range(400):
p = Thread(target=work) #多线程耗时2s多
l.append(p)
p.start()
for p in l:
p.join()
stop = time.time()
print('run time is %s' %(stop-start)) '''
4核
run time is 2.0911200046539307
'''
多进程耗时42秒多
from multiprocessing import Process
import os
import time def work():
time.sleep(2) if __name__ == '__main__':
l = []
print(os.cpu_count())
start = time.time()
for i in range(400):
p = Process(target=work) #多进程耗时2s多
l.append(p)
p.start()
for p in l:
p.join()
stop = time.time()
print('run time is %s' %(stop-start)) '''
4
run time is 42.8494508266449
'''
应用:
多线程用于IO密集型,如socket,爬虫,web
多进程用于计算密集型,如金融分析
python 并发编程 多线程 GIL与多线程的更多相关文章
- Python - 并发编程,多进程,多线程
传送门 https://blog.csdn.net/jackfrued/article/details/79717727 在此基础上实践和改编某些点 1. 并发编程 实现让程序同时执行多个任务也就是常 ...
- python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用
什么是多任务? 简单地说,就是操作系统可以同时运行多个任务.实现多任务有多种方式,线程.进程.协程. 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任 ...
- python并发编程之多进程、多线程、异步和协程
一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行.即使是单CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- python并发编程&多线程(二)
前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
- python并发编程——多线程
编程的乐趣在于让程序越来越快,这里将给大家介绍一个种加快程序运行的的编程方式--多线程 1 著名的全局解释锁(GIL) 说起python并发编程,就不得不说著名的全局解释锁(GIL)了.有兴趣的同 ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
- python并发编程&多线程(一)
本篇理论居多,实际操作见: python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
随机推荐
- mysql之单表条件查询
create table staff_info( id int primary key auto_increment, name varchar(32) not null, age int(3) un ...
- python--moviepy--视频编辑
MoviePy是一个用于视频编辑的python模块,你可以用它实现一些基本的操作(比如视频剪辑,视频拼接,插入标题),还可以实现视频合成,还有视频处理,抑或用它加入一些自定义的高级的特效.总之,它的功 ...
- springboot 开启缓存
Caching Data with Spring This guide walks you through the process of enabling caching on a Spring ma ...
- Python 正则表达式Ⅲ
re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始https://www.xuanhe.net/不符合正则表达式,则匹配失败,函数返回None:而re.se ...
- wget下载与tar压缩/解压
目录 wget命令 下载整个网站 压缩与解压 小节 wget命令 Usage: wget [OPTION]... [URL]... # 后台运行 -b, --background go to back ...
- b2b推广方式有哪些-
b2b推广方式有哪些 老黄牛推广软件订做 Q:935744345 专业团队,高效推广
- 仅1年GitHub Star数翻倍,Flink 做了什么?
Apache Flink 是公认的新一代开源大数据计算引擎,其流水线运行系统既可以执行批处理程序也可以执行流处理程序.目前,Flink 已成为 Apache 基金会和 GitHub 社区最为活跃的项目 ...
- 51 Nod 线段最长重叠部分
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 ...
- 1502: [NOI2005]月下柠檬树
一堆圆台平行光的投影 在草稿纸上画一下,发现对于一个圆,它投影完还是一个半径不变的圆. 定义树的轴在投影平面上经过的点为原点,定一个正方向,建立平面直角坐标系, 能发现,对于一个半径为\(r\),高度 ...
- 利用pdfbox和poi抽取pdf、doc以及docx格式的内容
使用pdfbox1.5.0抽取pdf格式文档内容,使用poi3.7抽取doc及docx文档内容: /** * Created by yan.shi on 2017/9/25. */ import or ...