何为协程,协程就是当程序遇见了IO(输入,输出)操作时,可以选择性的切换到其他任务上,在微观上它就是一个任务一个任务的切换(切换条件一般就是IO操作),在宏观上,我们看到的就是多任务一起执行。
像下面个例子,是一个单任务同步函数。

import time
def fun():print('涂涂傻')time.sleep(3)print('涂涂真的傻')
if __name__ == '__main__':fun()

结果:

涂涂傻
(等三秒)
涂涂真的傻

其中的time.sleep(3)就是让当前线程处于一个长达三秒钟的阻塞,就是此时的cpu不是为我而工作。而协程就是将这阻塞的三秒钟的cpu拿去为其他任务工作,合理利用这休眠的时间。
input()request.get(bilibili)这些,程序都是处于阻塞状态,而一般情况下,当程序进行IO操作时,线程都是会处于阻塞状态。
而上面所讲的都是在单线程下,而异步协程运用于多线程情况下,那么我们接下来说说多任务异步协程。
首先我们需要导入异步协程的模块asyncio,没安装的,先安装哦

import asyncio

然后我们可以创建一个异步协程函数,记住此时就要在def前面加上async,不然你创建的函数就是个正常的函数

async def fun():#async中文意思异步print('你好呀,我是涂涂')

此时如果像普通函数那样执行,你会发现得不到结果,因为此时是异步协程函数,执行得到的是一个协程对象

g=fun()
print(g)

运行结果:

<coroutine object fun at 0x000001E6AA805140>

如果我们想要执行这个异步协程函数,那么我们得使用它内置的函数asyncio.run(),这个函数需要asyncio模块的支持。

asyncio.run(g)

运行结果:

你好呀,我是涂涂

既然知道了一个异步协程函数怎么构建了,那么接下来我们就多写几个异步协程函数吧

import asyncio
async def fun1():print('你好呀,我叫涂涂')await asyncio.sleep(3)  #异步操作的代码print('你好呀,我是你爸爸')
async def fun2():print('德玛西亚')await asyncio.sleep(2)print('艾欧里亚')
async  def fun3():print('哈哈哈')await asyncio.sleep(4)print('呜呜呜')

我们用await asyncio.sleep()模拟阻塞情况,就是此时将这个函数挂起,记住这里不要用time.sleep(),因为程序只有遇见await这个关键字就会跳出来,去执行其他程序,但如果是time.sleep()就不会跳出,这样的话是同步,而不是异步了。
然后我们写一个main()函数来运行一下

async def main():tasks=[asyncio.create_task(fun1()),asyncio.create_task(fun2()),asyncio.create_task(fun3())]await asyncio.wait(tasks)

就是将三个函数变成了一个任务列表。
在python3.8版本后,需要加上asyncio.create_task()来创建任务,以前的版本可以不需要添加。
运行一下看看

 t1=time.time()asyncio.run(main())t2=time.time()print("耗时:",t2-t1)

运行结果:

你好呀,我叫涂涂
德玛西亚
哈哈哈哈
艾欧里亚
你好呀,我是你爸爸
呜呜呜
耗时:4.005320310592651

然后我们来说说在如何在爬虫上用到异步协程

import asyncio
async def download(url):print('准备开始下载')await asyncio.sleep(2)#模拟网络请求,get()print('下载完成')async def main():urls=['baidu.com','sogou.com','bilibili.com']tasks=[]for url in urls:d=download(url)tasks.append(asyncio.create_task(d))await asyncio.wait(tasks)

这就是一个简单的模拟从网上下载的异步协程框架,接下来我们以一个实际的小例子,从网上随便找几张图片下载。
在进行网络请求的时候,我们需要用到另外一个模块aiohttp等价于将requests.get()同步操作———>异步操作aiohttp

import aiohttp
import asynciourl=['http://kr.shanghai-jiuxin.com/file/bizhi/20211206/oka0yp3aj1t.jpg','http://kr.shanghai-jiuxin.com/file/bizhi/20211201/aesbpiexavr.jpg','http://kr.shanghai-jiuxin.com/file/bizhi/20211201/r0jwwdpfjjp.jpg']async def download(url):#发送请求     s=aiogttp.ClientSession()<==>request#得到回应#写入内容name=url.rsplit('/',1)[1]async with aiohttp.ClientSession() as session:#等价于requestasync with session.get(url) as resp:#等价于resp=request.get()#请求回来了,写入文件#可自己学习使用aiofiles模块with open(name,'wb')as f:f.write(await resp.content.read())#读取内容也是io操作,需要await挂起,拿取页面源代码resp.text()print(name,'ok')
async def main():tasks=[]for i in url :tasks.append(asyncio.create_task(download(i)))await asyncio.wait(tasks)
if __name__ == '__main__':loop = asyncio.get_event_loop()loop.run_until_complete(main())

如果你使用asyncio.run()会自动关闭循环,并且调用_ProactorBasePipeTransport.__del__报错, 而asyncio.run_until_complete()不会.
运行结果:

oka0yp3aj1t.jpg ok
r0jwwdpfjjp.jpg ok
aesbpiexavr.jpg ok

一个自己用的学习笔记,如有不对,还望大佬予以斧正。

Python爬虫之协程相关推荐

  1. python爬虫之协程理解爬取照片的简单版

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.引入库 二.使用步骤 1.上代码 总结 前言 协程就是异步爬取 能够快速的爬取数据 高效利用CPU 当发生等待事件 ...

  2. python从网址爬图片协程_Python爬虫多任务协程爬取虎牙MM图片

    查看: 4420|回复: 241 [作品展示] Python爬虫多任务协程爬取虎牙MM图片 电梯直达 发表于 2019-4-17 21:35:47 | 只看该作者 |倒序浏览 |阅读模式 马上注册,结 ...

  3. Python小爬虫之协程爬虫快速上手

    文章目录 前言 协程 协程快速上手 协程异步运行 工作流程 任务管理 aiohttp 异步保存 异步回调 前言 爬虫是个好东西,最近要用用这玩意,所以顺便把以前的小东西给发出来,水几篇博客~ 协程 首 ...

  4. Python 异步,协程,学起来好头疼,Python爬虫程序能调用GPU去爬东西吗?

    78 技术人社群日报时间 文章目录 Python 爬虫程序能调用 GPU 去爬东西吗? Python 异步,协程--,学起来好头疼 有没有牛子大的说下 `matplotlib` 里 `plot` 和 ...

  5. python中的协程(二)

    协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他 ...

  6. Python 中 异步协程 的 使用方法介绍

    静觅 崔庆才的个人博客:Python中异步协程的使用方法介绍:https://cuiqingcai.com/6160.html Python 异步 IO .协程.asyncio.async/await ...

  7. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  8. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  9. 二十五、深入Python中的协程

    @Author: Runsen 一说并发,你肯定想到了多线程+进程模型,确实,多线程+进程,正是解决并发问题的经典模型之一.但对于多核CPU,利用多进程+协程的方式,能充分利用CPU,获得极高的性能. ...

  10. Python中的协程

    Python中的协程 文章目录 Python中的协程 一.什么是协程 1.概念 2.协程的好处 3.缺点 二.了解协程的过程 1.yield工作原理 2.协程在运行过程中有四个状态: 3.预激协程的装 ...

最新文章

  1. 首次揭秘!大麦如何应对超大规模高性能选座抢票?
  2. 勘误表:《网络程序设计(第二版)》西安电子科技大学出版社
  3. [转载]Eclipse.ini的相关说明
  4. 创建和触发Notification
  5. spring事务在web环境中失效的问题
  6. 音视频开发(27)---H264基本原理
  7. Linux获取执行文件路径,如何 获取linux进程的执行文件路径
  8. oracle windows 优化工具,使用Windows工具管理Nt上的Oracle数据库
  9. 开发一个自己的 CSS 框架(二) 1
  10. 全国30m精度二级分类土地利用数据
  11. iOS中的Runloop
  12. 网络安全实验1——口令攻击和钓鱼攻击
  13. 畅捷通(chanjet)T1各版本
  14. 引入jackson-dataformat-xml的影响
  15. 软件实施是一个什么样的职位?
  16. java file文件大小_Java实现获取文件大小的几种方法
  17. r语言寻找1000以内的质数
  18. ssd1963初始化程序
  19. 读书笔记-Iass、Pass、SasS 、DaaS
  20. Unity 3D 菜单栏与快捷键

热门文章

  1. 福永苹果服务器维修,苹果维修记录iphone app store更新打不开的解决方法
  2. element-ui图片上传组件之限制每次5张上传(或者自定义每次几张上传)
  3. 《论文阅读》Generating Responses with a Specific Emotion in Dialog
  4. win10修改用户名/指纹无法置入/用户文件没有重命名的选项
  5. 与世界有怎样的关系,便拥有了怎样的自己
  6. 小米笔记本android,全球唯一 独家定制:「安卓中国版」小米笔记本电脑Air图赏...
  7. 打印ie浏览器去除页眉页脚问题
  8. Alice and the List of Presents CodeForces - 1236B 数学推导
  9. 【ImgtuUtil】路过图床基础 Java 工具类(支持登录、上传、删除图片等操作)
  10. 【生活】Java程序员的心理抗争(一)