asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。例如:
# -*- coding: utf-8 -*-
import threading
import asyncio
@asyncio.coroutine
def hello():
print('Hello world! (%s)' % threading.currentThread())
yield from asyncio.sleep(1)
print('Hello again! (%s)' % threading.currentThread())
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
运行结果:
Hello world! (<_MainThread(MainThread, started 4589409728)>)
Hello world! (<_MainThread(MainThread, started 4589409728)>)
Hello again! (<_MainThread(MainThread, started 4589409728)>)
Hello again! (<_MainThread(MainThread, started 4589409728)>)
@asyncio.coroutine把一个generator标记为coroutine类型,然后,我们就把这个coroutine扔到EventLoop中执行。
用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。
hello()会首先打印出Hello world!,然后,yield from语法可以让我们方便地调用另一个generator。由于asyncio.sleep()也是一个coroutine,所以线程不会等待asyncio.sleep(),而是直接中断并执行下一个消息循环。当asyncio.sleep()返回时,线程就可以从yield from拿到返回值(此处是None),然后接着执行下一行语句。
把asyncio.sleep(1)看成是一个耗时1秒的IO操作,在此期间,主线程并未等待,而是去执行EventLoop中其他可以执行的coroutine了,因此可以实现并发执行。
为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async和await,其中:
把@asyncio.coroutine替换为async;
把yield from替换为await。
上述例子可以改成:
# -*- coding: utf-8 -*-
import threading
import asyncio
async def hello():
print("Hello world!")
r = await asyncio.sleep(1)
print("Hello again!")
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
本文详细介绍了Python中asyncio库的使用方法,包括如何通过@asyncio.coroutine和yield from实现异步操作,以及Python3.5之后的async和await语法。通过示例代码展示了如何创建和运行协程,实现并发执行。

1084

被折叠的 条评论
为什么被折叠?



