asyncio理解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章