如果你想了解异步编程,那么必然会涉及出许多相关概念。

  • 堵塞/非堵塞
  • 同步/异步
  • 多进程/多线程/协程

为什么我要学习这个话,因为我想搞懂异步框架和异步接口的调用。所以,我的学习路线是这样的:

1.python异步编程

2.python Web异步框架(tornado/sanic)

3.异步接口调用(aiohttp/httpx)

那么异步编程有什么好处?在某些场景下它可以提高性能。我们知道CPU的速度快于磁盘、网络等IO。一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,才能进行下一步操作。这种情况称为同步IO。我们可以使用多线程来解决这类问题,另一种方式是通过异步。

python在3.4版本引入asyncio,到 3.5版本又加入async/await来简化异步的使用。

先来举个简单的例子,假如,你和女朋友逛街。你的目的是去看新上市的华为P40手机,而你女朋友是去看新款的衣服。你们的逛街流程是这样的。

import time

def clothes_shop():
print("女朋友看衣服..")
time.sleep(8)
print("...出来了") def huawei_shop():
print("体验手机..")
time.sleep(5)
print("...出来了") print(time.ctime(), "开始逛街")
clothes_shop()
huawei_shop()
print(time.ctime(), "结束.")

运行结果:

Thu Apr 16 00:08:22 2020 开始逛街
女朋友看衣服..
...出来了
体验手机..
...出来了
Thu Apr 16 00:08:35 2020 结束.

假设单位是分钟,你们总共耗时13分钟。

接下来,看看用异步是如何处理的:

import asyncio
import time async def shop(delay, what):
print(what)
await asyncio.sleep(delay)
print("...出来了") async def main():
task1 = asyncio.create_task(shop(8, '女朋友看衣服..'))
task2 = asyncio.create_task(shop(5, '体验手机..')) print(time.ctime(), "开始逛街")
await task1
await task2
print(time.ctime(), "结束.") asyncio.run(main())

通过 async/await 语法进行声明,是编写 asyncio 应用的推荐方式。

  • async 声明一个函数为异步函数。
  • await 声明处理比较耗费时的动作。
  • asyncio.run() 函数用来运行最高层级的入口点 main() 函数。
  • asyncio.create_task() 函数用来并发运行作为 asyncio 任务 的多个协程。

其实,思路非常简单,就是你和女朋友各逛各自的,先出来的等等对方。

严重警告!提醒广大直男,现实生活中千万不要这么思考问题。一定要陪女朋友一起看衣服,还要主动去付钱。

来看看运行结果:

Thu Apr 16 00:19:19 2020 开始逛街
女朋友看衣服..
体验手机..
...出来了
...出来了
Thu Apr 16 00:19:27 2020 结束.

假设单位是分钟,只需要8分钟搞定。

通过上面的例子,可以看到 task1、task2仍然有前后顺序,这种前后顺序的时间可以忽略不计。但是,我们也是可以使用asyncio.gather()方法并发运行任务。

#……

async def main():
print(time.ctime(), "开始逛街")
await asyncio.gather(
shop(8, '女朋友看衣服..'),
shop(5, '体验手机..')
)
print(time.ctime(), "结束.") asyncio.run(main())

运行结果同上,这里就不再贴了。

参考:https://docs.python.org/zh-cn/3/library/asyncio.html

python 异步 I/O的更多相关文章

  1. Python异步IO --- 轻松管理10k+并发连接

    前言   异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...

  2. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  3. python异步加协程获取比特币市场信息

    目标 选取几个比特币交易量大的几个交易平台,查看对应的API,获取该市场下货币对的ticker和depth信息.我们从网站上选取4个交易平台:bitfinex.okex.binance.gdax.对应 ...

  4. 深入理解Python异步编程(上)

    本文代码整理自:深入理解Python异步编程(上) 参考:A Web Crawler With asyncio Coroutines 一.同步阻塞方式 import socket def blocki ...

  5. 这篇文章讲得精彩-深入理解 Python 异步编程(上)!

    可惜,二和三现在还没有出来~ ~~~~~~~~~~~~~~~~~~~~~~~~~ http://python.jobbole.com/88291/ ~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  6. [django]python异步神器-celery

    python异步神器celery https://segmentfault.com/a/1190000007780963

  7. 转-python异步IO-asyncio

    原文连接 http://blog.chinaunix.net/uid-190176-id-4223282.html 前言 异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上 ...

  8. uvloop —— 超级快的 Python 异步网络框架

    简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...

  9. python 异步编程

    Python 3.5 协程究竟是个啥 Yushneng · Mar 10th, 2016 原文链接 : How the heck does async/await work in Python 3.5 ...

  10. python异步初步窥探

    1.异步之难:因为其执行吮吸不可预料,当下正要发生什么事件不可预料.        程序下一步行为往往依赖上一步值执行结果,如何知晓上次异步调用已完成并获取结果,        回调成了必然选择,那又 ...

随机推荐

  1. CodeForces - 1244E

    题意:给n个数,可以有k次的 + 1或 - 1,在k次操作之内,让n个数的最大值和最小值差最小. 思路:要让max和min的差值最小,也就等同于min--,max++,如果k==0结束操作,或者min ...

  2. 3.介绍ASP.NET Core框架

    介绍ASP.NET Core框架 在这篇文章中,我将要向你们简短介绍一下ASP.NET Core 框架.当今社会,当提到软件开发,每个人都是讨论着开源以及跨平台开发.总所周知,微软是以它的基于Wind ...

  3. 一个js函数算出任意位数的水仙花数

    一个算出任意位数的水仙花数的函数如下: var arr =[]; /*更改num确定取值范围*/ for(var num = 100; num <= 9999;num++){ /*多位数版本*/ ...

  4. iOS 静态:动态 Pod

    一.静态和动态 在项目中使用 pod 实现模块化,对于子模块和第三类库的导入方式存在两种:静态库.动态库. 当在 podfile 中指定 use_frameworks! 时,子模块和第三方类库将被打包 ...

  5. JS 剑指Offer(四) 从尾到头打印链表

    题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...

  6. 【线段树基础】NKOJ 1321 数列操作

    时间限制 : 10000 MS   空间限制 : 165536 KB 问题描述 假设有一列数{Ai}(1≤i≤n),支持如下两种操作:将Ak的值加D.(k, D是输入的数)输出As+As+1+…+At ...

  7. B - 来找一找吧 HihoCoder - 1701(排列组合 + 同余差值相同)

    这次到渣渣问桶桶了... 准备给你n个数a1, a2, ... an,桶桶你能从中找出m个特别的整数吗,我想让任意两个之差都是k的倍数. 请你计算有多少种不同的选法.由于选法可能非常多,你只需要输出对 ...

  8. 如何让Java应用成为杀不死的小强?(下篇)

    各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 经过前两期的铺垫及烧脑的分享,我们大概对「如何实现 Java 应用进程的状态监控,如果被监控的进程 down 掉,是否 ...

  9. c期末笔记(4)

    未命名易错点 1.0<y<10 在c语言中,0<y<10不是一个正确的表达式,应该利用逻辑运算符替换(y>0&&y<10或者!(y<=0||y ...

  10. BigDecimal 笔记

    参数 BigDecimal 类主要有如下几个参数 这几个参数都比较好理解,看过这两个例子基本都能明白,现在总结一下就是 scale // 小数点后位数 precision // 一共位数 intCom ...