鱼C论坛

 找回密码
 立即注册
查看: 1687|回复: 1

[技术交流] 多任务篇章之(协程篇)

[复制链接]
发表于 2019-3-12 02:32:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
协程

  1. '''
  2. 子程序/函数:在所有语言中,都是层级调用,比如在A调用B,在B执行过程中又可以调用C,C执行完毕返回,B执行完毕返回,最后A执行完毕返回
  3. 是通过栈实现的,一个线程就是执行一个子程序,子程序调用总是一个入口,一次返回,调用顺序总是明确的
  4. 开始运行===A====>B=====>C   开始返回===C====>B=====>A
  5. 概述:看上去也是子程序,单执行过程中,在子程序的内部可中断,然后转而去执行别的子程序 ,他不是函数调用,有点类似CPU中断
  6. '''
  7. '''
  8. def C():
  9.     print("C---Start")
  10.     print("C---End")
  11. def B():
  12.     print("B---Start")
  13.     C()
  14.     print("B---End")
  15. def A():
  16.     print("A---Start")
  17.     B()
  18.     print("A---End")
  19. A()
  20. '''
  21. def A():
  22.     print("A---1")
  23.     print("A---2")
  24.     print("A---3")
  25. def B():
  26.     print("B---1")
  27.     print("B---2")
  28.     print("B---3")
  29. '''
  30. A---1==>A---2==>B---1==>B---2==>B---3==>A---3
  31. 执行以上结果,但是A中没有B的调用,看起来A,B执行的过程有点像线程,但是协程的特点是在于只有一个线程在执行
  32. 与线程相比,协程的执行效率非常高,因为只有一个线程,也不存在变量的的冲突,在协程汇总资源共享不加锁,只需要判断状态
  33. '''
复制代码

协程原理
  1. '''
  2. Python对协程的支持是通过generator实现的
  3. '''
  4. def run():
  5.     print("run--1")
  6.     yield 10
  7.     print("run--2")
  8.     yield 20
  9.     print("run--3")
  10.     yield 30

  11. #协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
  12. #返回值是一个生成器
  13. m = run()
  14. print(next(m))
  15. print(next(m))
  16. print(next(m))
复制代码


协程数据传输
  1. def run():
  2.     #空变量,存储的作用data始终为空
  3.     data = None
  4.     r = yield data
  5.     #r = a
  6.     print("run--1",r,data)
  7.     r = yield data
  8.     #r = b
  9.     print("run--2",r,data)
  10.     r = yield data
  11.     #r = c
  12.     print("run--3",r,data)
  13.     r = yield data

  14. #协程的最简单风格,控制函数的阶段执行,节约线程或者进程的切换
  15. #返回值是一个生成器
  16. my = run()
  17. #启动生成器
  18. print(my.send(None))
  19. #
  20. #传递参数
  21. print(my.send("a"))
  22. print(my.send("b"))
  23. print(my.send("c"))
  24. print("*"*8)
复制代码

协程的生产与消费
  1. def product(c):
  2.     c.send(None)
  3.     for i in range(5):
  4.         print("生产数据产生{}数据".format(i))
  5.         r = c.send(str(i))
  6.         print("消费数据消费{}数据".format(r))
  7.     c.close()
  8. def customer():
  9.     data = ""
  10.     while True:
  11.         n = yield data
  12.         if not n:
  13.             return
  14.         print("消费数据消费{}数据".format(n))
  15.         data = "200"
  16. c = customer()  #消费者生成器
  17. product(c)
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-14 18:55:21 | 显示全部楼层
哇,这是学了多久啊?好棒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-14 19:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表