Python-协程

协程又称微线程,在单线程里多并发

协程修改同一份数据可以不用加锁

协程拥有自己的寄存器上下文和栈,协程遇到IO操作就会自动切换到其它协程,协程切换时,会保留上一次调用时的状态,协程切换回来的时候,就会恢复先前保留的状态继续运行

#-*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

from greenlet import greenlet

def test1():
    print('a')
    g2.switch() #跳转到test2函数,执行print('c')
    print('b')
    g2.switch() #跳转到test2函数,到上次跳转的位置,执行print('d')

def test2():
    print('c')
    g1.switch() #跳转到test1函数,到上次跳转的位置,执行print('b')
    print('d')
if __name__ == '__main__':
    g1 = greenlet(test1)  #生成一个协程
    g2 = greenlet(test2)
    g1.switch() #启动协程

运行结果

遇到IO操作就切换,但是还是没有自动地进行io切换

#-*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import gevent

def test1():
    print('in the test1')
    gevent.sleep(2) #遇到IO操作,自动切换,切换到test3
    print('in the test1 again')

def test2():
    print('in the test2')
    gevent.sleep(1) #进行IO切换,切换到test3,因为test1还在进行IO操作
    print('in the test2 again')

def test3():
    print('in the test3')
    gevent.sleep(0) #0秒也会进行io切换,切换到test2
    print('in the test3 again') #执行完之后执行test1

if __name__ == '__main__':
    gevent.joinall([
        gevent.spawn(test1), #生成一个协程
        gevent.spawn(test3),
        gevent.spawn(test2),
    ])

运行结果

遇到IO操作进行切换的顺序为生成协程的顺序

运行顺序:首先执行test1函数,打印in the test1,然后遇到IO操作,切换到test3函数。在test3函数中,先打印in the test3,然后遇到IO操作,切换到test2中,打印in the test2,然后遇到test2函数中的IO操作,切换到test3函数,因为它进行IO操作为0秒,执行完test3函数后,执行test2函数,因为test1还在进行IO操作。

整个过程只花了2秒,为最大的秒数

原文地址:https://www.cnblogs.com/sch01ar/p/8437159.html