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 140735195337472)>)
Hello world! (<_MainThread(MainThread, started 140735195337472)>)
(暂停约1秒)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)
两个coroutine是由同一个线程并发执行的。
如果把asyncio.sleep()换成真正的IO操作,则多个coroutine就可以由一个线程并发执行。
意思是,在同一个线程中,使用多个协程,某个协助中的I/O操作耗时较长时,中断该线程中的该协程,转而去执行该线程中别的协程。从而在一个线程中,实现接近并发的操作,提示I/O密集型工作的效率。
小结:
asyncio提供了完善的异步IO支持;
异步操作需要在coroutine中通过yield from完成;通过yield from去调用另一个另一个generator;
多个coroutine可以封装成一组Task然后并发执行。