Python用yield from实现异步协程爬虫的实践
作者:Python无霸哥 发布时间:2023-10-23 13:30:46
标签:Python,yield,from,异步协程爬虫
一、什么是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: PyCharm
def main():
'''
遍历0到4,这五个数,并分别打印
'''
for num in range(5):
yield num
if __name__ == '__main__':
for num in main():
print(num)
print('-'*50)
for num in [0, 1, 2, 3, 4]:
print(num)
将它看作列表用for循环遍历,就能取出其中的值。
二、yield于列表的区别
它与原来列表的区别就在于,自带的列表是固定的,而把yield看作列表的话是动态的。
具体案例描述请看代码及备注(PS:个人自己描述的,有不对的地方望各位指点)
# -*- coding: utf-8 -*-
# @Time : 2023/01/11 15:24
# @Author : 红后
# @Email : not_enabled@163.com
# @blog : https://www.cnblogs.com/Red-Sun
# @File : 实例2.py
# @Software: PyCharm
def main():
'''
将yield看作一个动态列表,从yield左往右为传出数据,从又往左为传入数据。
PS:有yield存在的那一行,需要从左往右传出数据跑一遍,数据出去以后又要从右往左带接收的数据跑一遍,一共一行跑两边(仅作者个人记忆方法)
'''
Python学习群:748989764
num1 = yield
num2 = yield
print(num1, num2)
yield num1 + num2
if __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]
三、yield from 实现协程
yield from 后面需要加可迭代对象
当它后面加上生成器(上述所说的yield这种)便可以实现生成的嵌套
老板(主程序):调用委派生成器
包工头(委派生成器):包含yield from表达式的生成器
打工仔(子生成器):生成器函数
其中委派生成器的作用:在主程序与子生成器之间建立一个双向通道。
所谓双向通道是指,主程序可以将参数通过send传递给子生成器,子生成器的yield的值也可以直接返回给主函数。(PS:委派生成器只有创建通道的作用,没有拦截数据这种功能)
也许有人会想直接用主程序调用子生成器不就行了,而对这的解释是,使用yield from作为中间过渡是为了让它帮我们进行异常处理(PS:类似写程序为了正常运行加上try一个道理)
# -*- coding: utf-8 -*-
# @Time : 2022/11/10 15:13
# @Author : 红后
# @Email : not_enabled@163.com
# @blog : https://www.cnblogs.com/Red-Sun
# @File : coroutines.py
# @Software: PyCharm
import requests
def coroutines_spider():
'''
子生成器(PS: 打工仔,真正干活的)
'''
response = None # 首次激活返回None,后期网页响应覆盖
while True:
url = yield response
response = requests.get(url)
def appoint():
'''
委派生成器,委托子生成器完成具体任务 (PS: 类似包工头负责劳务派遣)
'''
while True:
yield from coroutines_spider() # 建立子生成器和主函数的双通道
def main(url_list: list):
'''
主函数(PS: 相当于老板,张贴招人启示)
'''
ul = appoint() # 创建委派生成器
next(ul) # 激活它
for url in url_list:
response = ul.send(url) # 将url作为参数传递进入子生成器中,返回子生成器yield出来的response
print(response.url, response.status_code) # 打印出response中的链接和状态码
if __name__ == '__main__':
url_list = ['https://www.baidu.com/', 'https://www.4399.com/', 'https://cn.bing.com/', ]
main(url_list=url_list)
来源:https://blog.csdn.net/weixin_45841831/article/details/128645395


猜你喜欢
- 先来看个用Python实现的二分查找算法实例import sys def search2(a,m): low = 0 high = le
- 今天我们使用 Pyecharts 制作一个地球可视化项目,一起来看看吧Let’s go!数据处理这里我们使用全球新冠感染
- 下面是我写的NumericStepper:谢谢 果果 和 Rimifon , 我对代码进行了完善, 支持自适应小数位数:
- str()将参数转换为字符串类型a = 26print('我有'+str(a)+'个苹果')输出:我有26个
- 前言:二分法也就是二分查找,它是一种效率较高的查找方法假如公司新来了一个人,叫张三,他是你们公司第47个人,过了一段时间后,有些人呢看张三不
- 本文实例讲述了Python爬虫实现网页信息抓取功能。分享给大家供大家参考,具体如下:首先实现关于网页解析、读取等操作我们要用到以下几个模块i
- 前言一首歌热门了,参与评论的人也很多,这时无论好坏评论都来了,没有人控评得话,指不定乱七八糟但是自己有喜欢看评论,不想影响好心情,想看看精彩
- 一 计算公式:二 实现代码(1)import mathfrom tqdm import tqdmimport timetotal,s,n,t
- 最近在做一个程序正好需要用到此方面,在网上找到过相应的程序,但用起来都非常恶,于是乎只好自己实现一个了。 首先实现两个函数用来操作光标:
- 1.在Qt Designer中设计两个简单窗口2.将.ui文件转换成.py文件3.新建**.py文件#-*- coding:utf-8 -*
- 我就废话不多说了,直接上代码吧!import mathimport numpy as npimport matplotlib.pyplot
- 1. 安装Pyechartspip install pyecharts2. 图表基础2.1 主题风格添加主题风格使用的是 InitOpts(
- 本文实例讲述了Python分支语句与循环语句应用。分享给大家供大家参考,具体如下:一、分支语句1、if else语句语法:if 条件判断:
- 本文总结分析了selenium2.0中常用的python函数。分享给大家供大家参考,具体如下:新建实例driver = webdriver.
- django自定义管理器和model的继承在我写代码时建立的很多数据库需要一些共同的字段,比如is_active, create_time这
- 1. 前言vue-cli 一个简单的构建Vue.js项目的命令行界面整体过程:$ npm install -g vue-cli $ vue
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 一、pandas分组1、分组运算过程:split->apply->combine拆分:进行分组的根据应用:每个分组运行的计算规则
- 1 各种疫苗梳理截至2022年3月,中国已经向120多个国家和国际组织提供了超过21亿剂疫苗,占中国以外全球疫苗使用总量的1/3。1.1 灭
- 运行截图运行效果:什么?你说你看不清烟花?那我换一种颜色,请点开看。实现过程准备工作使用语言和框架:python、pygame。安装pyga