一、协程:
1、生成器只有在调用时才会生成相应的数据
2、调用方式有 " str__next__.() str.send() ",
3、并且每调用一次就产生一个值调用到最后一个值后会报错
4、报错可用try和except做异常处理
注意:
next:是直接调用yield,并不会传值。
send:是调用并直接传值给yield。
1 #!/usr/bin/env python 2 # -*- coding:utf8 -*- 3 # Author:Dong Ye 4 5 6 ‘‘‘ 7 定义两个模型: 8 一个是生产包子的。(生成器) 9 另一个是吃包子的。(迭代器) 10 11 这段功能实现了异步IO的雏形,也是一个简单的协程处理方式。 12 协程的特点:实际是串行方式分开执行的,但由于运行效果快,给人的感觉像是并行。 13 因此,协程也叫作:单线程下的并行执行效果。 14 协程是包含在线程里的一个单位,线程时进程的一个单位。 15 例如:enginx在异步单线程下,比多线程要快好多倍,也就是这种效果。 16 ‘‘‘ 17 18 import time 19 20 21 #吃包子的 22 def consumer(name): 23 print(‘%s 准备吃包子了!‘ % name) 24 while True: 25 baozi = yield 26 print("包子[%s]来了。被[%s]吃了!" %(baozi,name)) 27 28 29 #生产包子的 30 def producer(name): 31 #先定义2个协程(消费者)#将函数变成生成器 32 c1 = consumer(‘A‘) #2个消费者 33 c2 = consumer(‘B‘) #相当于2个协程(进程,线程,协程) 34 #开始调用生成器初始化(准备吃包子) 35 c1.__next__() #开始调用生成器,只有next的时候才会到yield进行下一个操作 36 c2.__next__() 37 print(‘老子开始吃包子拉!‘) 38 #循环的次数,每次循环都会传值给生成器(产生什么样的包子) 39 for i in range(10): 40 time.sleep(1) 41 print("做了一个包子,分2半,一人一半") 42 c1.send(i) #包子的类型 43 c2.send(i) 44 45 46 producer("alex") 47 48 49 50 ‘‘‘ 51 #手动做包子: 52 c = consumer("dy") 53 c.__next__() 54 #c.__next__() 55 56 b1 = "韭菜馅" 57 c.send(b1) #调用+传值 58 #c.__next__() #只调用,不传值 59 ‘‘‘ 60 61 62 63 64 显示结果: 65 A 准备吃包子了! 66 B 准备吃包子了! 67 老子开始吃包子拉! 68 做了一个包子,分2半,一人一半 #任务1 69 包子[0]来了。被[A]吃了! #任务2 70 包子[0]来了。被[B]吃了! #任务3 71 做了一个包子,分2半,一人一半 72 包子[1]来了。被[A]吃了! 73 包子[1]来了。被[B]吃了! 74 做了一个包子,分2半,一人一半 75 包子[2]来了。被[A]吃了! 76 包子[2]来了。被[B]吃了! 77 做了一个包子,分2半,一人一半 78 包子[3]来了。被[A]吃了! 79 包子[3]来了。被[B]吃了! 80 做了一个包子,分2半,一人一半 81 包子[4]来了。被[A]吃了! 82 包子[4]来了。被[B]吃了! 83 做了一个包子,分2半,一人一半 84 包子[5]来了。被[A]吃了! 85 包子[5]来了。被[B]吃了! 86 做了一个包子,分2半,一人一半 87 包子[6]来了。被[A]吃了! 88 包子[6]来了。被[B]吃了! 89 做了一个包子,分2半,一人一半 90 包子[7]来了。被[A]吃了! 91 包子[7]来了。被[B]吃了! 92 做了一个包子,分2半,一人一半 93 包子[8]来了。被[A]吃了! 94 包子[8]来了。被[B]吃了! 95 做了一个包子,分2半,一人一半 96 包子[9]来了。被[A]吃了! 97 包子[9]来了。被[B]吃了!