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秒,为最大的秒数

浙公网安备 33010602011771号