Titan笔记

  • 首页
  • Java
  • 数据结构
  • Web
  • C语言
  • Python
  • 杂谈
  • 逸笔挥墨
Titan笔记
分享学习、研究与开发过程中的点滴记忆
  1. 首页
  2. Python
  3. 正文

[Python] 关于 asyncio 与 aiohttp 协程并发的探索

2020年2月23日 646点热度 0人点赞 0条评论

前言

最近对几种并发的方式进行了很多探索。之前一直采用多线程、多进程来提高单个程序的并发数。但是这两种方式各有各的不足之处,在进行频繁的I/O操作的时候,多进程模式的效率并不是很理想,而多线程消耗了很多系统资源,如果处理不当还会出现内存泄漏的情况。于是了解到了Python的标准库中的 asyncio ,采用协程的方式异步调用函数。

asyncio介绍

关于协程的中文文档非常之少,于是基本上我的所有探索都是基于官方的Documentation来的。
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。
asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。

asyncio的基础用法

下面用我写的一个例子来说明基本的用法:

import asyncio

async def test(i):
me = str(i)
print("I am Test --" + me)
await asyncio.sleep(1) # 用来模拟进行一些任务
print("Task Over! --" + me)

if __name__ == '__main__':
loop = asyncio.get_event_loop()
tasks = asyncio.wait([test(i) for i in range(3)])
print("Start Tasks")
loop.run_until_complete(tasks)
print("Main process over")

 

这个程序将会得到的结果是:

Start Tasks at 2020-02-09 17:00:00
I am Test --2--at 2020-02-09 17:00:00
I am Test --1--at 2020-02-09 17:00:00
I am Test --0--at 2020-02-09 17:00:00
Task Over! --2-at 2020-02-09 17:00:01
Task Over! --1-at 2020-02-09 17:00:01
Task Over! --0-at 2020-02-09 17:00:01
Main process over at 2020-02-09 17:00:01

 

显然,三个coroutine都是并发进行的,并没有等待三个三秒的时间,都是在一秒内同时完成了任务

asyncio + aiohttp

关于协程的一个最佳用途莫非是并发的进行HTTP请求了,这在编写爬虫程序的时候有着极佳的性能。
而你需要知道的是,不要在协程中使用 requests库 ,因为requests库是IO阻塞的,和协程并不能很好的兼容。
所以这里就引入了asyncio的最佳搭档:aiohttp

aiohttp的基础用法

这里我同样写了一个简单的示例来让你快速的了解aiohttp的特性,不难看出的是,aiohttp和requests的用法是很相似的,只不过它对于协程的支持非常的好。

import asyncio
import aiohttp

async def sendHTTP(url):
async with aiohttp.ClientSession() as ss:
async with ss.get(url) as r:
print("HTTP Status:" + str(r.status))
print(await r.text())

if __name__ == '__main__':
loop = asyncio.get_event_loop()
print("Start!")
# 以获取Github的时间轴作为示例
loop.run_until_complete(sendHTTP("https://api.github.com/events"))
print("Over!")

 

总结

以上就是Python3中的协程并发的基础用法,更多的介绍可以查阅一下相关的文档。

asyncio的Python官方Documentation:
https://docs.python.org/3.5/library/asyncio-task.html
aihttp Documentation:
https://docs.aiohttp.org/en/stable/

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: aiohttp Asyncio Python Python协程 协程
最后更新:2020年2月23日

Titan

兴趣广泛而无一精擅
想到什么,我总是渴望以代码的方式去呈现
永远年轻,永远热泪盈眶
Stay Hungry, Stay Foolish

点赞
下一篇 >

文章评论

取消回复

Titan

兴趣广泛而无一精擅
想到什么,我总是渴望以代码的方式去呈现
永远年轻,永远热泪盈眶
Stay Hungry, Stay Foolish

逸笔挥墨 - Titan的文学天地
文章分类
  • C语言 (4)
  • Hadoop (1)
  • Hive (3)
  • Java (19)
  • JavaWeb (4)
  • Linux运维之道 (1)
  • Mybatis学习笔记 (3)
  • Python (3)
  • SpringCloud (4)
  • Web (5)
  • Web前端 (4)
  • Web后端 (5)
  • 数据库 (1)
  • 数据结构 (10)
  • 杂谈 (3)
  • 诗词歌赋 (1)
  • 逸笔挥墨 (3)
  • 随摘 (3)
最新 热点 随机
最新 热点 随机
Spring Cloud 微服务学习笔记 - 负载均衡服务调用 Spring Cloud 微服务学习笔记 - Eureka 服务注册与发现 Spring Cloud 微服务学习笔记 - IDEA工程搭建 关于我和Titan笔记 Spring Cloud 微服务学习笔记 - 开篇 TitanEMS - Titan企业员工管理系统 - JavaWeb期末实践项目
Spring Cloud 微服务学习笔记 - 开篇随摘,其一诗摘,其一关于我和Titan笔记《梦之浮桥》中的几句随摘,其二
[数据结构] 队列的链式存储实现 [数据结构] 使用最小堆思想实现哈夫曼编解码 MySQL ORDER BY,GROUPBY 与各种JOIN Spring Cloud 微服务学习笔记 - 开篇 [PHP框架] ThinkPHP6 介绍、安装及配置 Spring Cloud 微服务学习笔记 - Eureka 服务注册与发现
标签聚合
二叉树 Mybatis学习笔记 链式存储 Python JavaWeb 数据结构 Apache-Hive Java
友情链接
  • Mttblog

COPYRIGHT © 2016 - 2021 Titan笔记. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

豫ICP备20001822号-1

豫公网安备 41010502004418号