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然後併發執行。