python-协程
概述
协程是什么?
协程是一种用户态的【伪轻量级线程】,即协程是由用户程序自己控制调度的
单线程的异步编程模型就是协程
本质上是一个线程
特点
1,能够在一个线程中实现并发
2,能够规避一些任务中的IO阻塞,在任务的执行过程中,检测到IO阻塞就切换任务
3,在一个线程上,提高CPU的利用率
4,在多个任务之间切换
5,协程比线程切换速度快
1 def consumer(): 2 while True: 3 x = yield 4 print('处理了数据:', x) 5 6 7 def producer(): 8 c = consumer() 9 next(c) 10 for i in range(10): 11 print('生产了数据:', i) 12 c.send(i) 13 14 15 producer()
greenlet.greenlet模块
方法(greenlet(func)实例化g)
g.switch() 切换到g这个协程上运行
1 from greenlet import greenlet 2 3 4 def eat(): 5 print('start eat') # 2 6 g2.switch() # 3,切换到g2的play() 7 print('end eat') # 6 8 g2.switch() # 7,切换到g2play() 9 10 11 def play(): 12 print('start play') # 4 13 g1.switch() # 5,切换到g1的eat() 14 print('end play') # 8 15 16 17 g1 = greenlet(eat) 18 g2 = greenlet(play) 19 20 g1.switch() # 1,切换到g1的方法eat
gevent模块
遇到gevent能识别的/O阻塞,程序会【自动】进行任务(协程)切换,实现并发效果
识别其他模块的阻塞
需要打打补丁:from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前
方法
spawn() 开始一个协程
join() 等待协程执行结束
joinall(g_list) for循环g_list执行里面的g对象join # g_list 是一个可迭代参数,里面存着所有需要join的g对象
属性
value 拿到协程的结果
1 from gevent import monkey; monkey.patch_all() 2 import time 3 import gevent 4 5 6 def eat(): 7 print('start eat') 8 time.sleep(1) # 遇到阻塞,自动切换到另一个协程 9 print('end eat') 10 return 9 11 12 13 def play(): 14 print('start play') 15 time.sleep(1) # 遇到阻塞,自动切换到另一个协程 16 print('end play') 17 18 19 g1 = gevent.spawn(eat) # 开始一个协程 20 g2 = gevent.spawn(play) # 开始另一个协程 21 22 g1.join() # 等待协程结束 23 g2.join() 24 25 print(g1.value) # g1的返回值
1 from gevent import monkey;monkey.patch_all() 2 import gevent 3 import time 4 5 6 def task(): 7 time.sleep(1) 8 print(12345) 9 10 11 def sync(): 12 for i in range(10): 13 task() 14 15 16 def async(): 17 g_lst = [] 18 for i in range(10): 19 g = gevent.spawn(task) 20 g_lst.append(g) 21 gevent.joinall(g_lst) # for循环g_lst执行join 22 23 24 async() # 异步 25 # sync() # 同步