亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對多個 HTTP 請求進行異步狀態檢查

對多個 HTTP 請求進行異步狀態檢查

素胚勾勒不出你 2023-07-11 10:44:18
我有一個列表,其中包含數千個指向遠程服務器上的圖像/視頻的 URL。就像是:urls = ['https://foo.bar/baz.jpeg', 'https://foo.bar/jaz.mp4', ...]通過獲取這些 url,某些響應會以404 Not Found形式出現,這沒關系,因為服務器上的數據可能已過時并被刪除。我想做的事情是以快速的方式識別哪些網址會給我404 。當我打開瀏覽器并在地址欄上輸入錯誤 URL 之一時,“未找到”錯誤大約需要 200 毫秒才能檢索到。通過進行一些簡單的計算,如果以異步方式進行,我預計大約 1.000 個調用將花費不超過 4 秒的時間完成。但是,通過使用這段代碼,我認為這是適當的:def async_check(urls):    async def fetch(session, url):        async with session.get(url) as response:            if response.status != 200:                return False            else:                return True    async def run(urls):        async with ClientSession() as session:            return await asyncio.gather(*[fetch(session, url) for url in urls])    return asyncio.get_event_loop().run_until_complete(run(urls))經過的時間就比較長了,有時甚至是超時了。我相信這是由于列表中的非錯誤網址造成的,這些網址指向可能需要很長時間才能加載為響應對象的圖像和視頻,并最終消耗大量時間才能完成任務。在思考了如何實現404的驗證之后,我得出了一個或多或少像這樣的流程:對于每個 url,使用 get 方法異步獲取它,并異步休眠相對較長的時間(例如 1 秒)。睡眠完成后,嘗試查看響應是否“就緒”,如果是,則將狀態代碼 404(或與 200 不同)添加到我的錯誤 URL列表中。如果睡覺后,響應沒有“準備好”,那么我會假設這是由于加載了大量圖像/視頻,并認為它沒有錯誤。由于每次調用的等待時間上限為 1 秒,因此我預計對于一堆 url 來說它會運行得相對較快。這會被認為是解決這個問題的巧妙方法,還是有更聰明的方法?
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

我相信這是由于列表中的非錯誤網址造成的,這些網址指向可能需要很長時間才能加載為響應對象的圖像和視頻,并最終消耗大量時間才能完成任務。


很難提前判斷這是否屬實,但您當然可以通過添加用于time.time()測量每個請求所用時間并打印其狀態的代碼來測試它。


請注意,除非您await response.read()或同等人員,否則客戶端不會“加載”響應正文,只有標頭“加載”。盡管如此,一些無故障的 URL 很可能需要很長時間才能返回標頭。也有可能一些有問題的需要很長時間才能返回錯誤狀態,也許是那些你沒有手動檢查的。asyncio.gather()所花費的時間與列表中最長的 URL 一樣長,因此,如果您有數千個 URL,則至少其中一些肯定會滯后。


fetch但假設你的前提是正確的,你可以通過包裝來實現限制wait_for:


    async def fetch_with_limit(session, url):

        try:

            return await asyncio.wait_for(fetch(session, url), 1)

        except asyncio.TimeoutError:

            return True  # took more than 1s, probably non-faulty

現在您可以使用fetch_with_limit來代替fetch.


查看完整回答
反對 回復 2023-07-11
  • 1 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號