高效能非同步爬蟲概述

2022-02-15 04:23:18 字數 2188 閱讀 8440

同步呼叫:即提交乙個任務後就在原地等待任務結束,等到拿到任務的結果後再繼續下一行**,效率低下,呼叫乙個任務,就在原地等待任務結束拿到結果後才繼續往後執行。

好處:在伺服器端使用多執行緒(或多程序)的目的是讓每個連線都擁有獨立的執行緒(或程序),這樣任何乙個連線的阻塞都不會影響其他的連線。

缺點:在遇到要同時處理成百上千個的連線請求時,則無論多執行緒還是多程序都會嚴重佔據系統資源,降低系統對外界響應效率,而且執行緒與程序本身也更容易進入假死狀態。

好處:減少建立和銷毀執行緒的頻率,其維持一定合理數量的執行緒,讓空閒的執行緒重新承擔新的執行任務。可以很好的降低系統開銷。

缺點:當請求大大超過上限時,「池」構成的系統對外界的響應並不比沒有池的時候效果好多少。所以使用「池」必須考慮其面臨的響應規模,並根據響應規模調整「池」的大小

總結:對應上例中的所面臨的可能同時出現的上千甚至上萬次的客戶端請求,「執行緒池」或「連線池」或許可以緩解部分壓力,但是不能解決所有問題。總之,多執行緒模型可以方便高效的解決小規模的服務請求,但面對大規模的服務請求,多執行緒模型也會遇到瓶頸,可以用非阻塞介面來嘗試解決這個問題。

弊端:io阻塞,無論是多程序還是多執行緒,在遇到io阻塞時都會被作業系統強行剝奪走cpu的執行許可權,程式的執行效率因此就降低了下來。

優點:從應用程式級別檢測io阻塞然後切換到我們自己程式的其他任務執行,這樣把我們程式的io降到最低,我們的程式處於就緒態就會增多,以此來迷惑作業系統,作業系統便以為我們的程式是io比較少的程式,從而會盡可能多的分配cpu給我們,這樣也就達到了提公升程式執行效率的目的。

在python3.4之後版本。可以利用asyncio模組檢測io阻塞,並實現非同步io。

非同步io:發起乙個 io阻塞 操作,卻不用等它結束,你可以繼續做其他事情,當它結束時,會得到通知。

實現非同步io操作方式:單執行緒+非同步協程

import asyncio

async

defexecute

(x):

print('number:', x)

coroutine = execute(1)

print('coroutine:', coroutine)

print('after calling execute')

loop = asyncio.get_event_loop()

loop.run_until_complete(coroutine)

print('after calling loop')

執行結果:

#環境安裝:pip install aiohttp

#使用該模組中的clientsession

#text()返回字串形式的響應資料

#read()返回的二進位制形式的響應資料

#json()返回的就是json物件

#注意:獲取響應資料操作之前一定要使用await進行手動掛起

高效能非同步爬蟲

目的 在爬蟲中使用非同步實現高效能的資料爬取操作。非同步爬蟲的方式 多執行緒 多程序 不建議 弊端 無法無限制的開啟多執行緒或者多程序 執行緒池 程序池 適當的使用 好處 可以降低系統對程序或者執行緒建立和銷毀的乙個頻率,從而很好的降低系統的開銷 弊端 池中線程或程序的數量是有上限 from mul...

高效能MySQL概述

mysql邏輯架構 事務的acid 隔離級別 四種隔離級別 隔離級別 髒讀不可重複讀 幻讀加鎖讀 read uncommitted yesyes yesno read commited noyes yesno repeatable read nono yesno serializable nono ...

高效能 爬蟲原理

socket 原理 本質上就是乙個socket服務端,乙個客戶端.客戶端在連線服務端的時候只是封裝了http協議頭以及訪問的位址 阻塞 import socket 阻塞 請求 非阻塞 http用的就是這種 請求方式,請求只管發出去,而阻塞的方式還等請求連線成功再發訊息。mport socket ip...