python因爲GIL(全局鎖)的存在,不能發揮多核的優點,其性能一直飽受詬病。然而在IO密集型的網絡編程裏,異步處理比同步處理能提高成百上千倍的效率,彌補了python性能方面的短板.python
===>> python3.0時代,標準庫裏的異步網絡模塊:select(很是底層)redis
===>> python3.0時代,第三方異步網絡庫:Tornado編程
===>> python3.4時代,asyncio:支持TCP,子進程.直接內置了對異步IO的支持。網絡
如今的asyncio,有了不少的模塊已經在支持:aiohttp,aiodns,aioredis等等.asyncio是python3.4版本引入到標準庫,python2x沒有加這個庫.併發
★同步是指完成事務的邏輯,先執行第一個事務,若是阻塞了,會一直等待,直到這個事務完成,再執行第二個事務,順序執行。異步
★異步是和同步相對的,異步是指在處理調用這個事務的以後,不會等待這個事務的處理結果,直接處理第二個事務去了,經過狀態、通知、回調來通知調用者處理結果。async
下面經過舉例來對比同步代碼和異步代碼編寫方面的差別,其次看下二者性能上的差距,咱們使用sleep(1)模擬耗時1秒的io操做。異步編程
·同步代碼:函數
import time def hello(): time.sleep(1) def run(): for i in range(5): hello() print('Hello World:%s' % time.time()) if __name__ == '__main__': run()
執行結果:(間隔約爲1s)oop
·異步代碼:
import time import asyncio # 定義異步函數 經過async關鍵字定義一個協程(coroutine) async def hello(): asyncio.sleep(1) print('Hello World:%s' % time.time()) def run(): for i in range(5): # 執行coroutine loop.run_until_complete(hello()) # 獲取EventLoop: loop = asyncio.get_event_loop() if __name__ =='__main__': run()
執行結果:
在上面帶中咱們經過async關鍵字定義一個協程(coroutine),固然協程不能直接運行,須要將協程加入到事件循環loop中,asyncio.get_event_loop:建立一個事件循環,而後使用run_until_complete將協程註冊到事件循環,並啓動事件循環.