python并发编程之协程知识点
由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行
单线程实现并发:切换+保存状态
第一种方法:使用yield,yield可以保存状态。yield的状态保存与操作系统保存线程状态很像,但是yield是代码级控制的,更更轻量级。
# 两个计算任务一个采用生成器切换并发执行 一个直接串行调用
import time
def task1():
a =
for i in range():
a += i
yield def task2():
g = task1()
b =
for i in range():
b +=
next(g)
s = time.time()
task2()
print("并发执行时间",time.time()-s) # 单线程下串行执行两个计算任务 效率反而比并发高 因为并发需要切换和保存
def task1():
a =
for i in range():
a += i
def task2():
b =
for i in range():
b +=
s = time.time()
task1()
task2()
print("串行执行时间",time.time()-s)
可以看出,对于纯计算任务而言,单线程并发反而使效率降低。而且使用yield来切换使得代码结构混乱。
第二种方法:使用greenlet模块,仅仅是对yield在封装。依然不能对检测IO操作。
import greenlet
def task1(name):
print("%s task1 run1" % name)
g2.switch(name) # 切换至任务2
print("task1 run2")
g2.switch() # 切换至任务2 def task2(name):
print("%s task2 run1" % name)
g1.switch() # 切换至任务1
print("task2 run2") g1 = greenlet.greenlet(task1)
g2 = greenlet.greenlet(task2)
g1.switch("jerry") # 为任务传参数
第三种办法:协程
协程: 指的是一个线程完成并发执行,协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的
- python的线程始于内核级别的,即由操作系统控制调度(遇到IO或执行事件过长就会被迫交出CPU执行权限,切换到其他线程)
- 单线程内开启协程,一旦遇到IO,就会从应用程序级别控制切换,以此来提升效率
优点:
1. 协程的切换开销更小,属于程序级别的切换,更加轻量级
2. 单线程内就可以实现并发的效果,最大限度的利用CPU
缺点:
1. 协程本质是单线程并发,无法利用多核,可以是一个程序开多个进程,每个进程内开启多个线程,每个线程内开启协程
2. 一旦协程遇到阻塞,将会阻塞整个线程
在CPython中,如果是计算密集型,使用协程是无法提高效率,反而因为切换任务导致效率较低,只能靠进程。IO密集型 多线程会比多进程效率高,因为多线程开销比多进程小的多。
import gevent
import time
from gevent import monkey # 导入monkey补丁
monkey.patch_all() # 打补丁 def task1():
print("task1 run")
# gevent.sleep()
time.sleep()
print("task1 over") def task2():
print("task2 run")
# gevent.sleep()
time.sleep()
print("task2 over") g1 = gevent.spawn(task1)
g2 = gevent.spawn(task2)
# g1.join()
# g2.join()
gevent.joinall([g1,g2])
- 协程执行时必须对协程对象调用join函数(join让主线程等待协程任务完成,因为主线程一旦结束,协程任务就不执行了。反过来说 要保证协程任务正常执行结束 必须保证主线程没有结束)
- 如果有多个任务,随便调用哪一个的join都会并发执行所有任务,但是需要注意如果有一个存在IO操作的任务没有被join,该任务将无法正常执行完毕。
- monkey补丁的原理,把原始的阻塞模块替换为修改后的非阻塞模块,来实现IO自定切换,所以打补丁的位置尽量要放在导入阻塞模块之前
python并发编程之协程知识点的更多相关文章
- 32 python 并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- 四 python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- python并发编程之协程(实践篇)
一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ...
- 第十篇.5、python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- 第 12 章 python并发编程之协程
一.引子 主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只用一个)情况下实现并发,并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作 ...
- 37、python并发编程之协程
目录: 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本节的主题是基于单线程来 ...
- python 并发编程之协程
一.协程 协程: 单线程下的并发,又称 微线程.协程是一种用户态的的轻量级线程,即协程是由用户程序自己控制调度的. 协程的本质就是在单线程下,由用户自己控制一个任务,遇到 io 阻塞就切换另外一个 ...
- python并发编程之协程
---恢复内容开始--- 一.join方法 (1)开一个主线程 from threading import Thread,currentThread import time def walk(): p ...
- python全栈开发从入门到放弃之socket并发编程之协程
一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...
随机推荐
- 利用nginx 反向代理解决跨域问题
说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题. 一般来说可以用来做:静态页面的服务器.静态文件缓存服务器.网站反向代理.负载均衡服务器等等,而且实现这一切,基本只需要改改那 ...
- APP网站安全漏洞检测服务的详细介绍
01)概述: 关于APP漏洞检测,分为两个层面的安全检测,包括手机应用层,以及APP代码层,与网站的漏洞检测基本上差不多,目前越来越多的手机应用都存在着漏洞,关于如何对APP进行漏洞检测,我们详细的介 ...
- 自定义修改Anaconda Jupyterlab Home目录
自定义修改Anaconda Jupyterlab Home目录 最近在使用Anaconda学习数据分析和机器学习,会使用到Jupyter,但是他默认目录是用户的目录,我并没有习惯将项目和资料放在C盘, ...
- pthread小结
参考1 https://computing.llnl.gov/tutorials/pthreads/ 参考2 http://man7.org/linux/man-pages/man7/pthreads ...
- DVWA 黑客攻防演练(十四)CSRF 攻击 Cross Site Request Forgery
这么多攻击中,CSRF 攻击,全称是 Cross Site Request Forgery,翻译过来是跨站请求伪造可谓是最防不胜防之一.比如删除一篇文章,添加一笔钱之类,如果开发者是没有考虑到会被 C ...
- MongoDB 基础(2019年开篇)
MongoDB基础知识: 1.什么是MongoDB NoSQL(NoSQL=Not Only SQL),意即"不仅仅是SQL". MongoDB是一个介于关系数据库和非关系数据库之 ...
- 理解SignalR
ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现即时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息及调用方法),即时通讯W ...
- C#标识符与关键字
标识符是指在程序中用来表示实物的单词,是分配给类型(类.结构.枚举.接口或委托).成员.变量或命名空间的名称.有效标识符必须遵循以下原则: 标识符不能以数字开头也不能包含空格: 标识符可以包含大小写字 ...
- C# 霍尼韦尔扫码枪扫码打印
程序运行背景条件: 1.将扫码枪调制串口驱动模式 2.将扫码枪所在串口拆分成几个虚拟串口 3.扫码枪扫描条码就打印条码 4.WinForm程序 条码控件使用 DevExpress.XtraEditor ...
- 24G的SSD有什么用
有台12G内存,带24G的SSD的笔记本,系统自带WINDOWS8,最近感觉很慢,就动手把1T的硬盘升级到512的SSD. BIOS里面明明看到24G的SSD,Windows里面就消失了(应该是坏掉了 ...