协程

什么是协程:
协程是一种轻量级线程,他也可以被叫做微线程。协程有自己的寄存器上下文和栈,调用的时候,将二者保存到其他地方。切回来时候在进行恢复。它可以不加锁的进行全局变量的控制,切换速度更快。

如何创建一个协程:
创建协程首先需要安装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操作的时候,或者是一些耗时等待操作的时候,就会自动的切换到下一个协程任务进行执行。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容