并行效果&迭代器

具体文章:ALEX的文章 https://www.cnblogs.com/alex3714/articles/5765046.html

串行的并行效果:

 4 import time
 5 
 6 def consumer(name):
 7     print("%s 准备吃包子啦!" %name)
 8     while True:
 9        baozi = yield
10 
11        print("[%s]包子来了,被[%s]吃了!" %(baozi,name))
12 
13 
14 
15 # c = consumer("小胡胡")  #已经变成生成器,接下来每一步都要用next
16 # c.__next__()
17 # a1= "鸡肉馅"
18 # c.send(a1)
19 # c.__next__()
20 
21 
22 def producer(name):
23     c = consumer('A')  #已经变成迭代器,接下来都要用next
24     c2 = consumer('B')
25     c.__next__()
26     c2.__next__()
27     print("老子开始准备做包子啦!")
28     for i in range(15):
29         a = ['茴香鸡蛋','茴香肉','韭菜鸡蛋','韭菜肉','白菜粉条鸡蛋','白菜肉','猪肉大葱',\
30             '牛肉大葱','羊肉胡萝卜','猪肉芹菜','猪肉菠菜','鸡蛋菠菜韭菜','纯肉馅','香菇肉','酸菜馅']
31         time.sleep(1)
32         print("[%s]做了1个\033[31;1m[%s]包子\033[0m,分两半一人一半!"%(name,a[i]))
33         c.send(a[i])
34         c2.send(a[i])
35 
36 producer("Tiger")

运行结果:

并行效果&迭代器
 1 A 准备吃包子啦!
 2 B 准备吃包子啦!
 3 老子开始准备做包子啦!
 4 [Tiger]做了1个[茴香鸡蛋]包子,分两半一人一半!
 5 [茴香鸡蛋]包子来了,被[A]吃了!
 6 [茴香鸡蛋]包子来了,被[B]吃了!
 7 [Tiger]做了1个[茴香肉]包子,分两半一人一半!
 8 [茴香肉]包子来了,被[A]吃了!
 9 [茴香肉]包子来了,被[B]吃了!
10 [Tiger]做了1个[韭菜鸡蛋]包子,分两半一人一半!
11 [韭菜鸡蛋]包子来了,被[A]吃了!
12 [韭菜鸡蛋]包子来了,被[B]吃了!
13 [Tiger]做了1个[韭菜肉]包子,分两半一人一半!
14 [韭菜肉]包子来了,被[A]吃了!
15 [韭菜肉]包子来了,被[B]吃了!
16 [Tiger]做了1个[白菜粉条鸡蛋]包子,分两半一人一半!
17 [白菜粉条鸡蛋]包子来了,被[A]吃了!
18 [白菜粉条鸡蛋]包子来了,被[B]吃了!
19 [Tiger]做了1个[白菜肉]包子,分两半一人一半!
20 [白菜肉]包子来了,被[A]吃了!
21 [白菜肉]包子来了,被[B]吃了!
22 [Tiger]做了1个[猪肉大葱]包子,分两半一人一半!
23 [猪肉大葱]包子来了,被[A]吃了!
24 [猪肉大葱]包子来了,被[B]吃了!
25 [Tiger]做了1个[牛肉大葱]包子,分两半一人一半!
26 [牛肉大葱]包子来了,被[A]吃了!
27 [牛肉大葱]包子来了,被[B]吃了!
28 [Tiger]做了1个[羊肉胡萝卜]包子,分两半一人一半!
29 [羊肉胡萝卜]包子来了,被[A]吃了!
30 [羊肉胡萝卜]包子来了,被[B]吃了!
31 [Tiger]做了1个[猪肉芹菜]包子,分两半一人一半!
32 [猪肉芹菜]包子来了,被[A]吃了!
33 [猪肉芹菜]包子来了,被[B]吃了!
34 [Tiger]做了1个[猪肉菠菜]包子,分两半一人一半!
35 [猪肉菠菜]包子来了,被[A]吃了!
36 [猪肉菠菜]包子来了,被[B]吃了!
37 [Tiger]做了1个[鸡蛋菠菜韭菜]包子,分两半一人一半!
38 [鸡蛋菠菜韭菜]包子来了,被[A]吃了!
39 [鸡蛋菠菜韭菜]包子来了,被[B]吃了!
40 [Tiger]做了1个[纯肉馅]包子,分两半一人一半!
41 [纯肉馅]包子来了,被[A]吃了!
42 [纯肉馅]包子来了,被[B]吃了!
43 [Tiger]做了1个[香菇肉]包子,分两半一人一半!
44 [香菇肉]包子来了,被[A]吃了!
45 [香菇肉]包子来了,被[B]吃了!
46 [Tiger]做了1个[酸菜馅]包子,分两半一人一半!
47 [酸菜馅]包子来了,被[A]吃了!
48 [酸菜馅]包子来了,被[B]吃了!
View Code

 

迭代器

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list列表tuple元组dict字典set集合str字符串等;

一类是generator(生成器),包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

1 >>> isinstance(iter([]), Iterator)
2 True
3 >>> isinstance(iter('abc'), Iterator)
4 True

小结

  1. 凡是可作用于for循环的对象都是迭代对象类型;
  2. 凡是可作用于next()函数的对象都是迭代器类型,它们表示一个惰性计算的序列,不运行就不执行;
  3. 集合数据类型如listdictstr等是迭代对象但不是迭代器,不过可以通过iter()函数获得一个迭代器对象。

 

上一篇:继承 重载/重写方法后,父类调用重写方法为什么是调用子类的方法,而重载则不会


下一篇:四种内部类