前言:python由於gil(全域性鎖)的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板,如最新的微服務框架japronto,resquests per second可達百萬級。
python還有乙個優勢是庫(第三方庫)極為豐富,運用十分方便。asyncio是python3.4版本引入到標準庫,python2x沒有加這個庫,畢竟python3x才是未來啊,哈哈!python3.5又加入了async/await特性。
在學習asyncio之前,我們先來理清楚同步/非同步的概念:
·同步是指完成事務的邏輯,先執行第乙個事務,如果阻塞了,會一直等待,直到這個事務完成,再執行第二個事務,順序執行。。。
·非同步是和同步相對的,非同步是指在處理呼叫這個事務的之後,不會等待這個事務的處理結果,直接處理第二個事務去了,通過狀態、通知、**來通知呼叫者處理結果。
下面通過舉例來對比同步**和非同步**編寫方面的差異,其次看下兩者效能上的差距,我們使用sleep(1)模擬耗時1秒的io操作。
·同步**:
importtime
defhello():
time.sleep(1)
defrun():
for i in range(5):
hello()
print('
hello world:%s
' % time.time()) #
任何偉大的**都是從hello world 開始的!
if__name__ == '
__main__':
run()
輸出:(間隔約是1s)
hello world:1527595175.4728756hello world:1527595176.473001hello world:1527595177.473494hello world:1527595178.4739306hello world:1527595179.474482
·非同步**:
importtime
import
asyncio
#定義非同步函式
async def
hello():
asyncio.sleep(1)
print('
hello world:%s
' %time.time())
defrun():
for i in range(5):
loop.run_until_complete(hello())
loop =asyncio.get_event_loop()
if__name__ =='
__main__':
run()
輸出:
hello world:1527595104.8338501hello world:1527595104.8338501hello world:1527595104.8338501hello world:1527595104.8338501hello world:1527595104.8338501
async def 用來定義非同步函式,其內部有非同步操作。每個執行緒有乙個事件迴圈,主線程呼叫asyncio.get_event_loop()時會建立事件迴圈,如果需要併發http請求怎麼辦呢,通常是用requests,但requests是同步的庫,如果想非同步的話需要引入aiohttp。你需要把非同步的任務丟給這個迴圈的run_until_complete()方法
,事件迴圈會安排協同程式的執行。
這裡引入乙個類,from aiohttp import clientsession,首先要建立乙個session物件,然後用session物件去開啟網頁。
session可以進行多項操作,比如post, get, put, head等。
前言:python由於gil(全域性鎖)的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板,如最新的微服務框架japronto,resquests per second可達百萬級。
python還有乙個優勢是庫(第三方庫)極為豐富,運用十分方便。asyncio是python3.4版本引入到標準庫,python2x沒有加這個庫,畢竟python3x才是未來啊,哈哈!python3.5又加入了async/await特性。
在學習asyncio之前,我們先來理清楚同步/非同步的概念:
·同步是指完成事務的邏輯,先執行第乙個事務,如果阻塞了,會一直等待,直到這個事務完成,再執行第二個事務,順序執行。。。
·非同步是和同步相對的,非同步是指在處理呼叫這個事務的之後,不會等待這個事務的處理結果,直接處理第二個事務去了,通過狀態、通知、**來通知呼叫者處理結果。
下面通過舉例來對比同步**和非同步**編寫方面的差異,其次看下兩者效能上的差距,我們使用sleep(1)模擬耗時1秒的io操作。
·同步**:
importtime
defhello():
time.sleep(1)
defrun():
for i in range(5):
hello()
print('
hello world:%s
' % time.time()) #
任何偉大的**都是從hello world 開始的!
if__name__ == '
__main__':
run()
輸出:(間隔約是1s)
hello world:1527595175.4728756hello world:1527595176.473001hello world:1527595177.473494hello world:1527595178.4739306hello world:1527595179.474482
·非同步**:
importtime
import
asyncio
#定義非同步函式
async def
hello():
asyncio.sleep(1)
print('
hello world:%s
' %time.time())
defrun():
for i in range(5):
loop.run_until_complete(hello())
loop =asyncio.get_event_loop()
if__name__ =='
__main__':
run()
輸出:
hello world:1527595104.8338501hello world:1527595104.8338501hello world:1527595104.8338501hello world:1527595104.8338501hello world:1527595104.8338501
async def 用來定義非同步函式,其內部有非同步操作。每個執行緒有乙個事件迴圈,主線程呼叫asyncio.get_event_loop()時會建立事件迴圈,如果需要併發http請求怎麼辦呢,通常是用requests,但requests是同步的庫,如果想非同步的話需要引入aiohttp。你需要把非同步的任務丟給這個迴圈的run_until_complete()方法
,事件迴圈會安排協同程式的執行。
這裡引入乙個類,from aiohttp import clientsession,首先要建立乙個session物件,然後用session物件去開啟網頁。
session可以進行多項操作,比如post, get, put, head等。
asyncio動態新增任務
asyncio.run forever 下動態新增任務 方法一 asyncio.run coroutine threadsafe coroutine,loop 方法二 asyncio.call soon threadsafe callback,args,context none 方法一 例項run ...
asyncio非同步的基礎理解
大概半年前開始使用asyncio。最初開始接觸asyncio是受到 車主 的影響,因為他說他的專案基本都是使用的aio的方式,例如aioredis,aiokafka,aiomysql等。但是之前對asyncio的用法一直有誤解,就連之前寫的非同步消費埋點資料的專案看似用了async的語法,但實際上並...
python學習筆記 非同步asyncio
asyncio是python 3.4版本引入的標準庫,直接內建了對非同步io的支援。asyncio的程式設計模型就是乙個訊息迴圈。我們從asyncio模組中直接獲取乙個eventloop的引用,然後把需要執行的協程扔到eventloop中執行,就實現了非同步io。用asyncio實現hello wo...