Python 异步IO

23 views

一直以为python是没有异步IO的,曾经在使用flask做客户端和服务端的时候,每次发送http连接都会阻塞掉主线程,不得不使用多线程来解决这个问题。当不需要返回结果的时候,线程越多,会导致你的http连接越多,越多的http连接线程被打开,会导致服务器出现无法连接的问题。

当时就想着能不能有一个异步IO的库,然而当时没有发现,今天突然发现有一个很良心的库asyncio。

asyncio 是一个单线程多协程的并行异步IO库。从Python3.5开始,使用async 关键字和await关键字来代替 @asyncio.coroutine 和 yield from 这两个关键字。

使用异步IO的步骤,第一步,定义一个异步函数。

import asyncio
async def hello_world(text):
    print(text)
    r = await asyncio.sleep(1) # 睡眠一秒钟
    print("{0} end the hello world".format(text))

在该异步函数中,作为一个协程,我们首先打印text,然后睡眠一秒钟,等待睡眠一秒钟之后,然后在输出打印。

第二步,我们使用消息循环来并行线程。

# 获取事件loop
loop = asyncio.get_event_loop()

# 定义任务 
tasks = [hello_world(text) for text in ['a', 'b', 'c']]

# 运行任务
loop.run_until_complete(asyncio.wait(tasks))

loop.close

三个协程会并行执行,但是在协程睡眠过程中,主线程并不会阻塞,会执行其他的协程。最终的执行结果如下所示:

Rating: 5.0/5. From 1 vote.
Please wait...