Coroutine,翻译成”协程“,初始碰到的人马上就会跟上面两个概念联系起来。直接先说区别,Coroutine是编译器级的,Process和Thread是操作系统级的。Coroutine的实现,通常是对某个语言做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。Process和Thread看起来也在语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有不同。Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时间到达后就会被os强制挂起。Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方。
所谓协程就是在一个线程中切换子进程,相比多线程有如下好处:最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
协程是为了协作操作进行的语言设计,一个协程函数被调用时创建一个协程对象,然后调用者就可以使用协程的函数send()来调用这个函数。一个协程可以在另一个协程里使用关键字await来暂停它的执行,当协程被暂停时,它的状态是被保存起来的,当它被再次激活时会恢复这个状态再次运行。
例子:
#asyncio_coroutine.py python 3.6
import asyncio
async def coroutine():
print('in coroutine')
event_loop = asyncio.get_event_loop()
try:
print('starting coroutine')
coro = coroutine()
print('entering event loop')
event_loop.run_until_complete(coro)
finally:
print('closing event loop')
event_loop.close()
输出结果如下:
starting coroutine
entering event loop
in coroutine
closing event loop
在这个例子里,导入asyncio库,然后获取事件循环,这里采用默认的事件循环,然后使用run_until_complete()方法来运行协程对象,当协程退出时再关闭事件对象。