前面跟大家講的request s和spynner都是單程序(單執行緒)的順序抓取,而併發和並行執行的非同步抓取會極大地提高抓取效率。
併發和並行使兩個相似的概念,併發是指在乙個時間段內發生若干事件的情況,並行是指在同一時刻發生若干事件的情況。
我們可以以cpu的工作方式來說明這兩個概念
單核cpu下,多工作業系統的各任務是以併發的方式執行的,因為只有乙個處理器,所以各任務會以分時的方式在一段事件內分別占用cpu依次執行,如果在自己分得的時間段內沒有完成,那麼就需要等到下一次得到cpu的使用權時才會繼續執行,直到整個任務完成,因為cpu的切換速度很快,所以給我們的感覺就是同時在執行多個任務
多核cpu下,因為有兩個以上(包含兩個)可以同時工作的核心,所以就有可能在各個核上執行的任務能同時進行,這就叫做並行
通過這張圖你應該能更好的理解(序列不在我們考慮的範圍內)
同步和非同步的概念,一般會涉及到多個任務或事件的參與。可以在併發或並行的背景下去理解這兩個概念
同步指的是併發或並行發生的各任務之間不是孤立獨自執行的,乙個任務的進行可能需要在獲得另乙個任務的給出的結果之後
或者說是只有乙個任務完成或給出乙個結果之後,另乙個任務在獲得這個結果後才能繼續執行
總之,各任務的執行會彼此相互制約,節奏和步調要協調好,否則就會出現錯誤
非同步指的是併發或並行發生的各任務之間彼此是獨立執行的,不受各自的影響,這是非同步與同步最主要的區別
當需要多個任務互相配合在併發或並行環境中合作完成時,就需要以同步的方式執行
作業系統是以訊號量機制來實現同步的,各類程式語言也在進行並行或併發程式設計時提供了同步機制
例如python在多執行緒設計時的鎖機制
當我們需要將乙個大的任務分解成若干個小的子任務時,各子任務可以分別獨自完成,彼此之間不需要互相協作,這是就可以考慮使它們非同步地並行或非同步地併發執行
這在資料抓取時始終很常見的模式,將若干要抓取的鏈結分為幾組,然後對每組分別使用子任務進行抓取,待各子任務抓取結束後,再將結果進行彙總,完成整個任務
關於這些概念大概就是這些,如果不是太明白,可以自己查閱資料弄明白
併發 並行 同步 非同步
併發 任務數量大於核心數,兩個或多個時間在同一時間間隔發生 並行 任務數量小於或等於核心數,兩個或多個時間在同一時間發生 你吃飯吃到一半,來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。你吃飯吃到一半,來了,你停了下來接了 接完後繼續吃飯,這說明你支援併發。不一定是同時的 你吃飯吃...
python 同步非同步,併發並行,同步鎖
併發 系統具有處理多個任務 動作 的能力 並行 系統具有同時處理多個任務 動作 的能力 同步 當程序執行到乙個io 等待外部資料 的時候,需要等待,等待即同步 非同步 當程序執行到乙個io 等待外部資料 的時候,不需要等待,待資料接收成功後,再回來處理。gil 全域性解釋鎖 無論你有多少個執行緒,你...
同步非同步?阻塞非阻塞?併發並行?
阻塞呼叫是指呼叫結果返回之前,呼叫者會進入阻塞狀態等待。只有在得到結果之後才會返回。非阻塞呼叫是指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。同步 在發出乙個同步呼叫時,在沒有得到結果之前,該呼叫就不返回。非同步 在發出乙個非同步呼叫後,呼叫者不會立刻得到結果,該呼叫就返回了。同...