|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
协程
- '''
- 子程序/函数:在所有语言中,都是层级调用,比如在A调用B,在B执行过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后A执行完毕返回
- 是通过栈实现的,一个线程就是执行一个子程序,子程序调用总是一个入口,一次返回,调用顺序总是明确的
- 开始运行===A====>B=====>C 开始返回===C====>B=====>A
- 概述:看上去也是子程序,单执行过程中,在子程序的内部可中断,然后转而去执行别的子程序 ,他不是函数调用,有点类似CPU中断
- '''
- '''
- def C():
- print("C---Start")
- print("C---End")
- def B():
- print("B---Start")
- C()
- print("B---End")
- def A():
- print("A---Start")
- B()
- print("A---End")
- A()
- '''
- def A():
- print("A---1")
- print("A---2")
- print("A---3")
- def B():
- print("B---1")
- print("B---2")
- print("B---3")
- '''
- A---1==>A---2==>B---1==>B---2==>B---3==>A---3
- 执行以上结果,但是A中没有B的调用,看起来A,B执行的过程有点像线程,但是协程的特点是在于只有一个线程在执行
- 与线程相比,协程的执行效率非常高,因为只有一个线程,也不存在变量的的冲突,在协程汇总资源共享不加锁,只需要判断状态
- '''
复制代码
协程原理
- '''
- Python对协程的支持是通过generator实现的
- '''
- def run():
- print("run--1")
- yield 10
- print("run--2")
- yield 20
- print("run--3")
- yield 30
- #协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
- #返回值是一个生成器
- m = run()
- print(next(m))
- print(next(m))
- print(next(m))
复制代码
协程数据传输
- def run():
- #空变量,存储的作用data始终为空
- data = None
- r = yield data
- #r = a
- print("run--1",r,data)
- r = yield data
- #r = b
- print("run--2",r,data)
- r = yield data
- #r = c
- print("run--3",r,data)
- r = yield data
- #协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
- #返回值是一个生成器
- my = run()
- #启动生成器
- print(my.send(None))
- #
- #传递参数
- print(my.send("a"))
- print(my.send("b"))
- print(my.send("c"))
- print("*"*8)
复制代码
协程的生产与消费
- def product(c):
- c.send(None)
- for i in range(5):
- print("生产数据产生{}数据".format(i))
- r = c.send(str(i))
- print("消费数据消费{}数据".format(r))
- c.close()
- def customer():
- data = ""
- while True:
- n = yield data
- if not n:
- return
- print("消费数据消费{}数据".format(n))
- data = "200"
- c = customer() #消费者生成器
- product(c)
复制代码 |
|