美文网首页
python 协程

python 协程

作者: 足__迹 | 来源:发表于2019-08-29 19:39 被阅读0次

    什么是协程

    • 协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的

    • 通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的

    协程和线程的差异

    • 在实现多任务时,线程会自己欢子一些数据,操作系统切换时需要恢复数据,所以线程恢复比较耗性能
    协程底层原理(举例)
    '''
    1,协程的实现原理,底层通过 yield 实现
    '''
    
    def work1(): #工作任务
        for i in range(10):
            print('work1----{}'.format(i))
            yield i
    
    def work2():
        for i in range(10):
            print('work2----{}'.format(i))
            yield i
    
    def work3():
        for i in range(10):
            print('work3----{}'.format(i))
            yield i
    
    
    g1 = work1()
    g2 = work2()
    g3 = work3()
    
    while True: #循环调用生成器实现任务切换
        try:
            print(next(g1))
            print(next(g2))
            print(next(g3))
        except StopIteration :
            pass
            break
    

    协程 greenlet

    python -m pip install greenlet
    示例

    '''
    1,展示greenelent ,不能自动切换需要手动切换
    '''
    import greenlet
    
    def work1():
        for i in range(10):
              print('work1----{}'.format(i))
              g2.switch()    #切换到g2
    
    
    
    def work2():
        for i in range(10):
              print('work2----{}'.format(i))
              g1.switch()  #切换到g1
    
    
    
    g1 = greenlet.greenlet(work1)  #返回协程对象
    g2 = greenlet.greenlet(work2)
    
    g1.switch()  #启动开关
    
    
    执行顺序

    gevent

    • greenlet 已经实现了协程,但是还是人工切换,gevent 提供了自动切换功能,其原理是执行过程中遇到IO操作,自动切换
    '''
    协程gevent IO操作会切换
    '''
    import gevent
    
    
    def work1():  # 工作任务
        for i in range(10):
            print('work1----{}'.format(i))
            gevent.sleep(0.5)
    
    
    def work2():
        for i in range(10):
            print('work2----{}'.format(i))
            gevent.sleep(0.5)
    
    
    g1 = gevent.spawn(work1) #指定工作函数
    g2 = gevent.spawn(work2) #指定工作函数
    g1.join()    #等待协程执行完成再往下走
    g2.join()
    
    
    

    相关文章

      网友评论

          本文标题:python 协程

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