Titan笔记

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

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

2020年2月23日 1511点热度 2人点赞 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

不为岁月流逝蹉跎,不为潮流的势头去附和

点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论
最新 热点 随机
最新 热点 随机
Docker配置IPv6容器网络支持 什么是Elastic Stack,ELK的发展历程 K8s中Pod的基本概念 云原生 - 浅谈容器基础与K8S架构设计 腾讯Serverless体验,使用TypeScript编写并部署云函数 Go-Proxy-Checker,一款基于Go编写的高性能代理服务器验证工具
[Java] Java多线程的探索 -获取新闻标题 Java获取文件MD5的方式 [杂谈] 什么是递归函数? [数据结构] 队列的链式存储实现 Titan商店 - 又一个Web静态项目 MySQL ORDER BY,GROUPBY 与各种JOIN
分类
  • Android
  • C语言
  • Elasticsearch
  • Hadoop
  • Hive
  • Java
  • JavaWeb
  • Kubernetes
  • Linux运维之道
  • Mybatis学习笔记
  • Python
  • SpringCloud
  • Web
  • Web前端
  • Web后端
  • 云原生
  • 并发编程
  • 开发工具
  • 数据库
  • 数据结构
  • 杂谈
  • 移动开发
  • 移动测试
  • 诗词歌赋
  • 软件测试
  • 逸笔挥墨
  • 随摘
标签聚合
Python 链式存储 Java Mybatis学习笔记 JavaWeb 二叉树 数据结构 Apache-Hive

COPYRIGHT © 2013-2021 Titan. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备20001822号-1

豫公网安备 41010502004418号