Python用yield form 实现异步协程爬虫

很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习 。争取用看得懂的字来描述问题 。
1.什么是yield如果还没有怎么用过的话,直接把yield看做成一种特殊的return(PS:本质 generator(生成器))return是返回一个值然后就终断函数了,而yield返回的是一个生成器(PS:不知道的直接看作特殊列表,看下面的代码案例)
# -*- coding: utf-8 -*-# @Time    : 2022/11/10 16:17# @Author  : 红后# @Email   : not_enabled@163.com# @blog    : https://www.cnblogs.com/Red-Sun# @File    : 实例1.py# @Software: PyCharmdef main():    '''    遍历0到4,这五个数,并分别打印    '''    for num in range(5):        yield numif __name__ == '__main__':    for num in main():        print(num)    print('-'*50)    for num in [0, 1, 2, 3, 4]:        print(num)将它看作列表用for循环遍历,就能取出其中的值 。
2.yield于列表的区别它与原来列表的区别就在于,自带的列表是固定的,而把yield看作列表的话是动态的 。具体案例描述请看代码及备注(PS:个人自己描述的,有不对的地方望各位指点)
# -*- coding: utf-8 -*-# @Time    : 2022/11/14 13:24# @Author  : 红后# @Email   : not_enabled@163.com# @blog    : https://www.cnblogs.com/Red-Sun# @File    : 实例2.py# @Software: PyCharmdef main():    '''    将yield看作一个动态列表,从yield左往右为传出数据,从又往左为传入数据 。    PS:有yield存在的那一行,需要从左往右传出数据跑一遍,数据出去以后又要从又往左带接收的数据跑一遍,一共一行跑两边(仅作者个人记忆方法)    '''    num1 = yield    num2 = yield    print(num1, num2)    yield num1 + num2if __name__ == '__main__':    a = main()    # 第一个next对应第一个yield的右边为空即None,所以动态列表中加入一个参数为None,返回值为列表的-1位是None    print(next(a))  # [None]    # 第二个通过send方法传入一个数1,即在上一次停止的地方从右往左传入参数,所以给num1赋值为1.然后继续找下一个yield,其右边的值依旧为None,加入动态列表,此时返回值-1位依旧是None    print(a.send(1))  # [None, None]    # 第三通过send方法传入一个数2,即在上一次停止的地方从右往左传入参数,所以给num2赋值为2.然后继续找下一个yield,其右边的值为num1 + num2,此时num1为1,num2为2,计算得返回值-1位为3    print(a.send(2))  # [None, None, num1 + num2]3.yield from 实现协程yield from 后面需要加可迭代对象当它后面加上生成器(上述所说的yield这种)便可以实现生成的嵌套

  1. 老板(主程序):调用委派生成器

    经验总结扩展阅读