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