非同步網路程式設計aiohttp的使用

2022-07-01 02:48:07 字數 2869 閱讀 2856

aiohttp的使用

安裝:

pip install asyncio因為有的**請求的時候會驗證ssl證書,如果是自簽名的ssl證書會出錯。

conn=aiohttp.tcpconnector(verify_ssl=false)#防止ssl報錯
class aiohttp.tcpconnector(*, ssl=none, verify_ssl=true, fingerprint=none, use_dns_cache=true, ttl_dns_cache=10, family=0, ssl_context=none, local_addr=none, resolver=none, keepalive_timeout=sentinel, force_close=false, limit=100, limit_per_host=0, enable_cleanup_closed=false, loop=none)

為了限制同時開啟的連線數量,我們可以將限制引數傳遞給聯結器:

conn = aiohttp.tcpconnector(limit=30)#同時最大進行連線的連線數為30,預設是100,limit=0的時候是無限制

limit_per_host:

conn = aiohttp.tcpconnector(limit_per_host=30)#預設是0

同一端點的最大連線數量。同一端點即(host, port, is_ssl)完全相同.

clientsession

首先我們建立乙個session物件,向下面這樣使用async宣告非同步,同時with上下文關鍵字 省去了關閉連線的**,

async with aiohttp.clientsession(connector=conn) as session:
下面是clientsession的所有引數,這裡用的比較多的是connector,headers,cookies其他的引數大家可以去自己探索一下。

上面我們建立了session物件,然後我們就要進行請求具體的**了。

async with session.get(url,headers=headers,timeout=60) as req: #獲得請求
這一步我們像使用requests那樣傳入headers引數並指定最大超時為60s。

clientresponse

然後我們判斷請求是否情況,之後我們使用await req.text()獲取了網頁的原始碼,注意這裡必須使用await關鍵字來獲取協程的結果。然後我們使用了lxml模組獲取這三個網頁的title標題。

到目前為止我們只是定義了乙個協程,並沒有真正的執行它接下來我們看看main方法是做什麼的。

full_urllist= ["","",""]         event_loop = asyncio.get_event_loop() #建立時間迴圈         

tasks = [getsource(url) for url in full_urllist]

results = event_loop.run_until_complete(asyncio.wait(tasks))#等待任務結束

首先我定義了乙個列表含有三個目標url,當前你可以定義更多。

asyncio.get_event_loop方法可以建立乙個事件迴圈,然後使用run_until_complete將協程註冊到事件迴圈,並啟動事件迴圈。

協程物件不能直接執行,在註冊事件迴圈的時候,其實是run_until_complete方法將協程包裝成為了乙個任務(task)物件。所謂task物件是future類的子類。儲存了協程執行後的狀態,用於未來獲取協程的結果。

asyncio.ensure_future(coroutine) 和 loop.create_task(coroutine)都可以建立乙個task,run_until_complete的引數是乙個futrue物件。當傳入乙個協程,其內部會自動封裝成task,task是future的子類。isinstance(task, asyncio.future)將會輸出true

aiohttp 支援非同步的網路請求模組

通常在進行網路資料採集時候我們會用到requests,urllib等模組,但是這些模組在使用中並不支援非同步,所以今天我們介紹乙個支援非同步網路請求的模組aiohttp.首先我們使用flask簡單的搭乙個伺服器 from flask import flask def xiaohua return i...

socket非同步程式設計 libevent的使用

這篇文章介紹下libevent在socket非同步程式設計中的應用。在一些對效能要求較高的網路應用程式中,為了防止程式阻塞在socket i o操作上造成程式效能的下降,需要使用非同步程式設計,即程式準備好讀寫的函式 或介面 並向系統註冊,然後在需要的時候只向系統提交讀寫的請求之後就繼續做自己的事情...

C 非同步網路程式設計

在進行網路程式設計過程中,有些函式會以阻塞的方式執行,此時就不能做其他事,十分沒有效率。c 提供了兩種非同步網路程式設計的方法來解決這個問題。一種方法是採用 asynchronous sockets,一種方法是呼叫非阻塞的 socket methods。一 asynchronous sockets ...