4)协程

一:什么协程

协程: coroutine/coro
- 轻量级线程(一个线程)
- 调度由用户控制
- 有独立的寄存器上下文和栈
- 切换时保存状态,回来时恢复

二:协程和多线程比较

协程: coroutine/coro
- 轻量级线程(一个线程)
- 调度由用户控制
- 有独立的寄存器上下文和栈
- 切换时保存状态,回来时恢复
- 异步
- 一次调用,多个入口和结果

多进程,多线程
- 系统调度
- 上下文切换
- 占用内存
- 耗费CPU时间
- 同步
- 一次调用一次返回

三:python中协程发展

Python中协程的发展
•Python 2.5   (PEP 342) -> yield
•Python 3.3   (PEP 380) -> yield from
•Python 3.4  (PEP3156)-> asyncio
•Python 3.5   (PEP 0492).async/await 
•Eventlet
•Greenlet
•gevent

四:协程使用发展

1.协程1期:模拟阶段
- 嵌套yield的函数交互运行
- next/send(None)激活yield
- send(data)向yield发送数据
示例1
  
 1 import time
 2  
 3  
 4 def consumer():
 5     r = ''
 6     while True:
 7        n = yield  r #生成器,遇到yield就停止,并返回到porducer,等send信号,在继续向下执行,执行完了返回到yield处,并返回r
 8        if not n:
 9            return
10        print('[CONSUMR] Consuming %s' %n)
11        time.sleep(1)
12        r = '200 OK'
13 
14 
15 def produce(c):
16     next(c) #第一次调用生成器
17     n = 0
18     while n < 5:
19         n += 1
20         print('[PRODUCE] Producing %s' % n)
21         r = c.send(n) #给生成器发送数据,并把yeild返回的数据给r
22         print('[PRODUCE] Producing %s' % r,n)
23     c.close()
24  
25 
26 if __name__ == '__main__':
27     c = consumer()
28     produce(c)
协程yeild
 

猜你喜欢

转载自www.cnblogs.com/lixiang1013/p/9320036.html