本文主要介绍一下协程的基本概念、对比多线程的优势,以及Python2.x系列和Python3.x系列的大体差别
协程(coroutine),又称为微线程,纤程。协程的作用:在执行A函数的时候,可以随时中断,去执行B函数,然后中断继续执行A函数(可以自动切换),单着一过程并不是函数调用(没有调用语句),过程很像多线程,然而协程只有一个线程在执行
协程可以很完美的处理IO密集型的问题,但是处理cpu密集型并不是他的长处。要充分发挥CPU的性能,可以结合多进程+多线程的方式。 IO密集型和CPU密集型
执行效率高,因为子程序切换函数,而不是线程,没有线程切换的开销,由程序自身控制切换。于多线程相比,线程数量越多,切换开销越大,协程的优势越明显
不需要锁的机制,只有一个线程,也不存在同时写变量冲突,在控制共享资源时也不需要加锁。
类库:
Gevent 是第三方库,通过greenlet实现,其基本思想:
Python3.x系列的geven用法和python2.x系列是一样的
Python3.x系列的协程还是有很多不同的地方,以后再吧这个坑补上,这主要介绍下主要的
asyncio
它的效果是和Gevent一样的,遇到IO操作的时候,自动切换上下文。
不同的是,它在tasks的操作:
task先把这个5个参数不同的函数全部加载进来,在执行任务,在这个过程中,任务执行是无序的
@asyncio.coroutine把一个generator标记为coroutine类型,然后把这个coroutine扔到eventloop中执行
yield from 语法让我们方便的调用另一个generator。由于asyncio.sleep()也是一个coroutine,线程不会等待,直接中断执行下一个消息循环。当asyncio.sleep()返回时,线程可以从yield from拿到返回值(此处是None),然后接着执行下一行语句
async/await
为了更好的表示异步IO,Python3.5开始引入了新的语法,async和await,让coroutine语法更简洁,它们是针对coroutine的新语法,只需要把@asyncio.coroutine替换为async、yield from替换为await
以上是Python协程的基础用法,以及比较成熟的类库,后面慢慢补上版本差异以及对应不同方法的不同作用
原文:https://www.cnblogs.com/cheyunhua/p/11017057.html