asyncio 非同步任務

2022-06-19 10:57:11 字數 4227 閱讀 4471

前言:python由於gil(全域性鎖)的存在,不能發揮多核的優勢,其效能一直飽受詬病。然而在io密集型的網路程式設計裡,非同步處理比同步處理能提公升成百上千倍的效率,彌補了python效能方面的短板,如最新的微服務框架japronto,resquests per second可達百萬級。

python還有乙個優勢是庫(第三方庫)極為豐富,運用十分方便。asyncio是python3.4版本引入到標準庫,python2x沒有加這個庫,畢竟python3x才是未來啊,哈哈!python3.5又加入了async/await特性。

在學習asyncio之前,我們先來理清楚同步/非同步的概念

·同步是指完成事務的邏輯,先執行第乙個事務,如果阻塞了,會一直等待,直到這個事務完成,再執行第二個事務,順序執行。。。

·非同步是和同步相對的,非同步是指在處理呼叫這個事務的之後,不會等待這個事務的處理結果,直接處理第二個事務去了,通過狀態、通知、**來通知呼叫者處理結果。

下面通過舉例來對比同步**和非同步**編寫方面的差異,其次看下兩者效能上的差距,我們使用sleep(1)模擬耗時1秒的io操作。

·同步**

import

time

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

·非同步**

import

time

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()時會建立事件迴圈,

你需要把非同步的任務丟給這個迴圈的run_until_complete()方法,事件迴圈會安排協同程式的執行。

如果需要併發http請求怎麼辦呢,通常是用requests,但requests是同步的庫,如果想非同步的話需要引入aiohttp。

這裡引入乙個類,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操作。

·同步**

import

time

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

·非同步**

import

time

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()時會建立事件迴圈,

你需要把非同步的任務丟給這個迴圈的run_until_complete()方法,事件迴圈會安排協同程式的執行。

如果需要併發http請求怎麼辦呢,通常是用requests,但requests是同步的庫,如果想非同步的話需要引入aiohttp。

這裡引入乙個類,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...