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
中执行。async
用asyncio
提供的@asyncio.coroutine
能够把一个generator标记为coroutine类型,而后在coroutine内部用yield from
调用另外一个coroutine实现异步操做。oop
hello()
会首先打印出Hello world!
,而后,yield from
语法能够让咱们方便地调用另外一个generator
。因为asyncio.sleep()
也是一个coroutine
,因此线程不会等待asyncio.sleep()
,而是直接中断并执行下一个消息循环。当asyncio.sleep()
返回时,线程就能够从yield from
拿到返回值(此处是None
),而后接着执行下一行语句。线程
把asyncio.sleep(1)
当作是一个耗时1秒的IO操做,在此期间,主线程并未等待,而是去执行EventLoop
中其余能够执行的coroutine
了,所以能够实现并发执行。code
为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async
和await,其中:
协程
把@asyncio.coroutine
替换为async
;utf-8
把yield from
替换为await
。 ci
上述例子能够改为:
# -*- 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()