什么是协程:
协程是一种轻量级线程,他也可以被叫做微线程。协程有自己的寄存器上下文和栈,调用的时候,将二者保存到其他地方。切回来时候在进行恢复。它可以不加锁的进行全局变量的控制,切换速度更快。
如何创建一个协程:
创建协程首先需要安装python的第三方模块,叫做greenlet和gevent。
首先介绍greenlet,内部封装了yield。也就是说,我们不需要每次都在调用生成器的next方法,来执行。首先创建一个协程对象,之后通过 对象名.switch()来进行协程的实现。
接下来介绍gevent,gevent实现更为简单,gevent的实质就是封装了greenlet对象,并且返回一个greenlet对象,首先通过gevent.spawn(函数名)来创建一个对象。之后通过 对象名.join()来实现协程。但是需要注意的是,有些情况下,我们需要用到猴子补丁,猴子补丁的意思就是将函数内部的耗时操作,全部都替换成为gevent内部的耗时对象。
以下几个例子说明了协程对象:
# greenlet
from greenlet import greenlet
def study():
for i in range(5):
print('ALbert is study ',i)
time.sleep(0.2)
g2.switch()
def listening_music():
for i in range(3):
print('ALbert is listening_music ',i)
time.sleep(0.2)
g1.switch()
g1 = greenlet(study)
g2 = greenlet(listening_music)
g1.switch()
# gevent
from gevent import monkey
import gevent
monkey.patch_all()
def study():
for i in range(5):
print('ALbert is study ',i)
time.sleep(0.2)
def listening_music():
for i in range(3):
print('ALbert is listening_music ',i)
time.sleep(0.2)
g1 = gevent.spawn(study)
g2 = gevent.spawn(listening_music)
g1.join()
g2.join()
print('------over-------')
二者之间的区别:
首先协程的实现可以有三种方法:
第一种就是通过yield关键字,但是这种方法不便于理解。
第二种就是greenlet,通过把yield进行封装,通过switch进行实现,但是他在实现的时候,每一次都需要人为的去指向下一个协程要执行的任务,显得太过于麻烦
第三种就是通过gevent来进行实现,gevent每一次遇到io操作的时候,或者是一些耗时等待操作的时候,就会自动的切换到下一个协程任务进行执行。