Python网络编程——协程

作者: techLee | 来源:发表于2018-06-24 19:55 被阅读946次

    个人独立博客:www.limiao.tech
    微信公众号:TechBoard


    协程的概念

    协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字表示就是协程

    协程也是实现多任务的一种方式

    协程yield的代码实现

    简单实现协程

    import time
    
    
    # 定义协程
    def work1():
        while True:
            print("work1...")
            time.sleep(1)
            yield
    
    def work2():
        while True:
            print("work2...")
            time.sleep(1)
            yield
    
    
    if __name__ == '__main__':
        g1 = work1()
        g2 = work2()
        while True:
            next(g1)
            next(g2)
    
    实现协程的第二种方式:greenlet

    greenlet介绍:为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变得更加简单

    首先使用pip安装greenlet模块:

    pip3 install greenlet
    

    greenlet的使用:

    # greentlet的使用
    import greenlet
    import time
    
    
    def work1():
        for i in range(10):
            print("work1")
            time.sleep(1)
            g2.switch()
    
    def work2():
        for i in range(10):
            print("work2")
            time.sleep(1)
            g1.switch()
    # 创建协程并指定任务
    g1 = greenlet.greenlet(work1)
    g2 = greenlet.greenlet(work2)
    
    if __name__ == '__main__':
        g1.switch()
    

    实现协程的第三种方式:gevent

    greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库——gevent

    gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行

    由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

    安装:

    pip install gevent
    
    gevent的使用
    # gevent的使用
    import gevent, time
    from gevent import monkey
    
    # gevent 遇到耗时操作(time, sleep, accept, recv, 网络请求)会切换到其他协程执行代码
    
    # 打补丁,让gevent 能够识别耗时操作
    monkey.patch_all()
    
    # 任务1
    def work1():
        for i in range(10):
            print("work1")
            # gevent.sleep(1)
            time.sleep(1)
    
    def work2():
        for i in range(10):
            print("work2")
            # gevent.sleep(1)
            time.sleep(1)
    
    if __name__ == '__main__':
        # 创建协程并指定执行的任务
        g1 = gevent.spawn(work1)
        g2 = gevent.spawn(work2)
    
        # 让主线程等待协程执行完成以后程序再退出
        g1.join()
        g2.join()
    
        # 注意点:如果程序一直运行,并且还有耗时操作,那么不需要使用join
    

    个人独立博客:www.limiao.tech
    微信公众号:TechBoard


    相关文章

      网友评论

        本文标题:Python网络编程——协程

        本文链接:https://www.haomeiwen.com/subject/icusyftx.html