python异步io协程处理文件_异步IO协程 (asyncio)

同步与异步

同步:先执行第一个事务,如果遇到阻塞(time.sleep()),会一直等待,直到第一个事务执行完毕,才会执行第二个事务

异步:与同步是相对的,指执行第一个事务的时候,如果遇到阻塞,会直接执行第二个事务,不会等待。通过状态、通知、回调来调用处理结果

异步

进程、线程都可以实现异步,用协程也可以实现异步

使用异步 IO,无非是提高我们写的软件系统的并发。 这个软件系统, 可以是网络爬虫,也可以是 Web 服务等等。

并发的方式有多种, 多线程, 多进程, 异步 IO 等。

多线程和多进程更多应用于 CPU 密集型的场景, 比如科学计算的时间都耗费在 CPU 上, 利用多核 CPU 来分担计算任务。

多线程和多进程之间的场景切换和通讯代价很高, 不适合 IO 密集型的场景。

而异步 IO 就是非常适合 IO 密集型的场景, 比如网络爬虫和 Web 服务。

IO 就是读写磁盘、 读写网络的操作, 这种读写速度比读写内存、 CPU 缓存慢得多, 前者的耗时是后者的成千上万倍甚至更多。 这就导致, IO 密集型的场景 99%以上的时间都花费在 IO 等待的时间上。 异步 IO 就是把 CPU 从漫长的等待中解放出来的方法

asyncio

asyncio 是 Python 3.4 版本引入的标准库, 直接内置了对异步 IO 的支持。

asyncio 的编程模型就是一个消息循环。 我们从 asyncio 模块中直接获取一个 EventLoop 的引用, 然后把需要执行的协程扔到 EventLoop 中执行, 就实现了异步 IO

(1)event_loop 事件循环: 程序开启一个无限的循环, 程序员会把一些函数注册到事件循环上。 当满足事件发生的时候, 调用相应的协程函数。

(2) coroutine 协程: 协程对象, 指一个使用 async 关键字定义的函数, 它的调用不会立即执行函数, 而是会返回一个协程对象。 协程对象需要注册到事件循环, 由事件循环调用。

(3) task 任务: 一个协程对象就是一个原生可以挂起的函数, 任务则是对协程进一步

封装, 其中包含任务的各种状态。

(4) future: 代表将来执行或没有执行的任务的结果。 它和 task 上没有本质的区别

(5) async/await 关键字: python3.5 用于定义协程的关键字, async 定义一个协程, await

用于挂起阻塞的异步调用接口。

同步

import time

now = lambda:time.time()

def foo():

time.sleep(1)

start = now()

for i in range(5):

foo()

print('同步所花费的时间: ',now()-start)

异步

import asyncio

import time

now = lambda:time.time()

print('协程实现异步')

async def foo():

asyncio.sleep(1)

start = now()

loop = asyncio.get_event_loop()

for i in range(5):

loop.run_until_complete(foo())

print('异步所花费的时间: ',now()-start)

协程异步几乎是同时进行执行的

时间差距相当大

定义协程

定义一个协程很简单, 使用 async 关键字, 就像定义普通函数一样

使用async来修饰一个函数,则该函数就称为一个协程对象

import asyncio

#通过aysnc定义一个协程,该协程不能直接运行,需要将协程加入到事件循环中

async def do_work(x):

print('waiting: %d'%x)

#调用协程

#1、创建一个事件循环

loop = asyncio.get_event_loop()

#2、将协程对象加入到事件循环中

loop.run_until_complete(do_work(3))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值