Python并发编程理解yield from、协程
一、首页,认识一下可迭代,迭代器和生成器
可迭代,如:list,dict,tuple,deque等都是可迭代对象;
验证,需要借助collections.abc这个模块(python2中没有)使用isinstance()来类别一个对象是否是可迭代的(Iterable),是否是迭代器(Iterator),是否是生成器(Generator)
代码如下:import collections
from collections.abc import Iterable.Iterator.Generator
#字符串
ast="xiaoming"
print("字符串:{}".format(ast))
print(isinstarnce(ast,Iterable))
print(isinstance(ast,Iterator))
print(isinstance(alist,Generator))
#列表
alist=[21,24,12,32,19]
print(isinstarnce(alist,Iterable))
print(isinstance(alist,Iterator))
print(isinstance(alist,Generator))
#字典
adict={"name":"王华","gender":"男","age":18}
print(isinstarnce(adict,Iterable))
print(isinstance(adict,Iterator))
print(isinstance(adict,Generator))
#deque
adeque=collections.deque("adbdef")
print("字符串:{}".format(adeque))
print(isinstarnce(adeque,Iterable))
print(isinstance(adeque,Iterator))
print(isinstance(adeque,Generator))
扩展知识:
可迭代对象,是其内部实现了,__iter__这个魔术方法。可以通过,dir()方法来查看是否有__iter__来判断一个变量是否是可迭代的;
迭代器:
对比可迭代对象,迭代器其实就是多了一个函数而已。就是__next__(),我们可以不再使用for循环来间断获取元素值。而是可以直接使用next()方法来实现。
迭代器是在可迭代的基础上实现的。要创建一个迭代器,我们首先得有一个可迭代对象。
**重点:生成器
生成器的概念是在python2.2中首次出现,之所以引入生成器的概念是为了实现一个在计算下一个值时不需要浪费空间的结构。生成器是在迭代器的基础上(可使用for循环可以使用next())再实现了yield。
yield是什么东西呢,它相当于我们函数里的return,在每次next()或者for遍历的时候都会yield这里将新的值返回回去,并在这里阻塞,等待下一次的调用。正是由于这样的机制,才使用生成器在python编程中大放异彩;
生成器的生命周期:
gen_creaated #等待开始执行
gen_running #解释器正在执行(只有多线程应用中才能看到这个状态)
gen_suspended #在yield表达式处暂停
gen_closed #执行结束
**协程
协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或者开始执行程序。
协程通过使用yield暂停生成器,可以将程序的执行流程交给其他的子程序,从而实现不同子程序的之间的交替执行。