1、协程,异步的概念

1.1 首先导入一段代码

import time
def func():print("我爱黎明!")time.sleep(3) #睡三秒,让当前线程处于堵塞状态。print("我真的爱黎明")
if __name__ == '__main__':a = time.time()func()b = time.time()print(b - a)

通过对运行结果来看,程序一系列完成下来至少要三秒钟的时间。

我爱黎明!
我真的爱黎明
3.0042407512664795

1.2 而在三秒多的时间里,其实有三秒钟是没有工作的,程序进入睡眠状态,在程序睡眠的期间,cpu是不为我们程序所工作的。

例如:生活中你去洗脚,当你正处于泡脚的时候,技师不能为你按摩,先去做别的事情,当你泡完脚后,在来为你按摩。

1.3 思考下我们写程序过程中,有没有什么其他语句也能让程序进入堵塞状态?

# 1. input()语句
# 输入语句 他执行的时候,会让程序停留在终端,等待用户输入,什么时候输入完,再继续往下走# 2.requests.get(url)
# 当我对url发送请求之后,在网络进行传输,并且url还要准备数据,再传送回来,这个过程我们需要等待服务器那边给我们传输数据,所以也是堵塞状态#所以总结:
# 一般情况,当程序处于I/O操作的时候(输入,输出),线程会处于堵塞状态

1.4 在程序的堵塞状态下,这个时候就需要用到协程操作了。

协程:当程序遇见了I/O操作的时候,可以选择性的切换到其他任务上,充分的利用CPU。
在微观上是一个任务一个任务的进行切换,切换条件一般都是IO操作
在宏观上,我们能看到的其实是多个任务一起在执行
# 简称 多任务异步操作

根据上一个例子,当你在泡脚的时候,技师不能为你按摩,则你可以让她帮你揉揉肩之类的,等到泡脚结束,再继续按摩。

上方所讲的一切,都是在单线程的条件下

2、多任务异步协程

2.1 首先简单了解异步协程操作

import asyncio # 导入协程模块async def func():print("我真的爱黎明")
if __name__ == '__main__':g = func() # 此时的函数是异步协程函数,# print(g) # 此时函数执行得到的是一个协程对象asyncio.run(g) # 协程程序运行需要asyncio模块的支持

当只有一个任务的时候,与之前写的没什么太大区别

2.2 此时引入多任务异步协程

先引入一段同步的操作

import time
def func():print("你好啊,我叫赛利亚")time.sleep(3) # 增加耗时操作print("你好啊,我叫赛利亚")
def func1():print("你好啊,我叫张东墙")time.sleep(2)print("你好啊,我叫张东墙")
def func2():print("你好啊,我叫王伟")time.sleep(4)print("你好啊,我叫王伟")if __name__ == '__main__':a=time.time()func()func1()func2()b = time.time()print(b-a,'s')

同步的话,就是程序一个接一个的进行操作,通过观察运行结果可以发现,程序跑了9秒多,其中9秒是程序睡觉的总时长。

/Users/wangminjie/Desktop/爬虫/venv/bin/python /Users/wangminjie/Desktop/爬虫/线程进程/协程.py
你好啊,我叫赛利亚
你好啊,我叫赛利亚
你好啊,我叫张东墙
你好啊,我叫张东墙
你好啊,我叫王伟
你好啊,我叫王伟
9.008739948272705 s

2.3 下面通过多任务异步协程的方式来进行编写

import asyncio
import time
async def func():print("你好啊,我叫赛利亚")time.sleep(3) # 增加耗时操作print("你好啊,我叫赛利亚")
async def func1():print("你好啊,我叫张东墙")time.sleep(2)print("你好啊,我叫张东墙")
async def func2():print("你好啊,我叫王伟")time.sleep(4)print("你好啊,我叫王伟")if __name__ == '__main__':a = time.time()p1 = func()p2 = func1()p3 = func2()tasks = [p1, p2, p3]# 一次性启动多个任务(协程)#多个任务的话,就得交给asyncio.wait来处理asyncio.run(asyncio.wait(tasks))b = time.time()print(b - a, 's')

通过运行结果可以发现,此时的异步操作和上面的同步操作的运行时间差不多

2.4 原因在于,time.sleep()  ,这个是一个同步操作,当程序出现了同步操作当时候,异步就会中断,此时需要将程序睡觉的操作改写为异步的操作asyncio.sleep即可,并用await挂起,当挂起的时候,程序就会切换到下一步进行操作。

import asyncio
import time
async def func():print("你好啊,我叫赛利亚")# 当程序出现了同步操作的时候,异步就中断了#time.sleep(3) # 增加耗时操作# await 挂起await asyncio.sleep(3) # 异步操作的代码print("你好啊,我叫赛利亚")
async def func1():print("你好啊,我叫张东墙")#time.sleep(2)await asyncio.sleep(2)print("你好啊,我叫张东墙")
async def func2():print("你好啊,我叫王伟")#time.sleep(4)await asyncio.sleep(4)print("你好啊,我叫王伟")if __name__ == '__main__':a = time.time()p1 = func()p2 = func1()p3 = func2()tasks = [p1, p2, p3]# 一次性启动多个任务(协程)#多个任务的话,就得交给asyncio.wait来处理asyncio.run(asyncio.wait(tasks))b = time.time()print(b - a, 's')

这样,就实现了多任务的异步协程操作,整体所用时间是程序中耗时最长的那一段时间加上多任务切换的时间。

/Users/wangminjie/Desktop/爬虫/venv/bin/python /Users/wangminjie/Desktop/爬虫/线程进程/协程.py
你好啊,我叫王伟
你好啊,我叫赛利亚
你好啊,我叫张东墙
你好啊,我叫张东墙
你好啊,我叫赛利亚
你好啊,我叫王伟
4.005831956863403 s

2.5 但是这样写多任务协程的话,会让主函数的的操作居多,所以需要换一种写法,通过封装一个函数来进行使用,并且这样写更完美的套在爬虫上。

import asyncio
import time
async def func():print("你好啊,我叫赛利亚")await asyncio.sleep(3) # 异步操作的代码print("你好啊,我叫赛利亚")
async def func1():print("你好啊,我叫张东墙")await asyncio.sleep(2)print("你好啊,我叫张东墙")
async def func2():print("你好啊,我叫王伟")await asyncio.sleep(4)print("你好啊,我叫王伟")
async def main():# 第一种写法# f1 = func()# await f1 # 一般await挂起操作放在协程对象前面# ....# 第二种写法(推荐)tasks = [func(), func1(), func2()]await asyncio.wait(tasks)
if __name__ == '__main__':a = time.time()asyncio.run(main())b = time.time()print(b - a, 's')

【运行结果】

并且执行效率还是和上一个程序一样的。

你好啊,我叫张东墙
你好啊,我叫赛利亚
你好啊,我叫王伟
你好啊,我叫张东墙
你好啊,我叫赛利亚
你好啊,我叫王伟
4.006398916244507 s

但是在输出的时候会有警告,但不影响程序运行。

可以这样改 在使用 asyncio.wait之前,将协程对象包装成tesk对象就可以了,只需要在协程对象之前加一个asyncio.create_task,相当于创建一个协程任务。

#tasks = [func(), func1(), func2()]tasks = [asyncio.create_task(func()),asyncio.create_task(func1()),asyncio.create_task(func2())]await asyncio.wait(tasks)

爬虫15——协程异步相关推荐

  1. IMI 基于 Swoole 开发的协程 PHP 开发框架 常驻内存、协程异步非阻塞

    介绍 IMI 是基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存.协程异步非阻塞IO等优点. IMI 框架文档丰富,上手容易,致力于让开发者跟使用传统 MVC 框架一样顺手. IMI 框 ...

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

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

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

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

  4. Python异步爬虫之协程抓取妹子图片(aiohttp、aiofiles)

    目录 前言 一.什么是协程? 二.协程的优势 三.代码分析 1.引入库 2.获取所有时间线的链接 3.获取一个时间线中所有相册的链接 4.获取一个相册中所有的图片链接以及相册的名字 5.下载并保存图片 ...

  5. python asyncio协程异步爬虫

    实践一下python的asyncio异步协程相关的库,爬取豆瓣电影top250,自己边查边试,写出个最基本的用法吧. import time import asyncio from functools ...

  6. Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地

    作者 | 俊欣 来源 | 关于数据分析与可视化 就在11月7日晚间,<英雄联盟>S11赛季全球总决赛决斗,在冰岛拉开"帷幕",同时面向全球直播.在经过了5个小时的鏖战, ...

  7. python进程\协程\异步IO

    进程 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! Python ...

  8. python异步和进程_12.python进程\协程\异步IO

    进程 Python中的多线程无法利用多核优势 , 所以如果我们想要充分地使用多核CPU的资源 , 那么就只能靠多进程了 multiprocessing模块中提供了Process , Queue , P ...

  9. 肝了整个周末,Python多进程、协程异步抓取英雄联盟皮肤并保存在本地

    就在11月7日晚间,<英雄联盟>S11赛季全球总决赛决斗,在冰岛拉开"帷幕",同时面向全球直播.在经过了5个小时的鏖战,EDG战队最终以3:2战胜来自韩国LCK赛区的D ...

最新文章

  1. Debugging Tools for Windows__from WDK7
  2. 推荐一些经过实践检验的学习方法
  3. maven工程使用spring-boot-devtools进行热部署,更改代码避免重启web容器
  4. (一)Maven 基本概念——根目录、项目创建、坐标
  5. linux中jdk添加字体_LINUX下JDK安装字体
  6. spring ORM管理
  7. javaweb基于SSM酒店入住管理系统设计与实现(含毕业论文、程序设计及数据库文件)
  8. 【信息系统项目管理师】第十五六章 配置管理和标准化
  9. 决定成功十种积极心态,成功有道理
  10. 逃亡97天!这位麻省理工博士生落网
  11. mysql典型安装和完全安装的区别_MySQL安装详解(安装版本mysql-5.5.25)
  12. 网络游戏中玩家在线数据的存取
  13. VUE--Form表单
  14. PP模块常用数据库表
  15. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)
  16. 正则表达式 /\{\{(.+?)\}\}/g是什么意思
  17. 判断对象部分属性不为空
  18. Word中的公式编辑器
  19. 我的小玩意之图片转帖工具
  20. vue+element ui实现好看的登录界面

热门文章

  1. 计算机毕业设计Java校园帮代服务系统的设计与实现(源码+系统+mysql数据库+Lw文档)
  2. 20060308: WOW角色不见了
  3. 数独游戏的两种编程思路+代码
  4. 更改 Windows 11 任务栏宽度/大小
  5. 11.14黄金下周行情解读,原油价格分析,黄金白银TD投资及解套
  6. 浮点数0.7在Java中是无法精确存储的,却为何能精确输出0.7
  7. 调用阿里API实现手机号归属地查询
  8. 网络编程之java简易聊天室实现
  9. exit函数和析构函数的关系
  10. 基于科大讯飞语音云windows平台开发