通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)

一、协程:
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]吃了!
协程的示例

 

posted @ 2017-12-25 17:52  风之岚翔  阅读(484)  评论(0编辑  收藏