前面跟你們講的request s和spynner都是單進程(單線程)的順序抓取,而併發和並行執行的異步抓取會極大地提升抓取效率。編程
併發和並行使兩個類似的概念,併發是指在一個時間段內發生若干事件的狀況,並行是指在同一時刻發生若干事件的狀況。多線程
咱們能夠以CPU的工做方式來講明這兩個概念併發
單核CPU下,多任務操做系統的各任務是以併發的方式運行的,由於只有一個處理器,因此各任務會以分時的方式在一段事件內分別佔用CPU依次執行,若是在本身分得的時間段內沒有完成,那麼就須要等到下一次獲得CPU的使用權時纔會繼續執行,直到整個任務完成,由於CPU的切換速度很快,因此給咱們的感受就是同時在運行多個任務異步
多核CPU下,由於有兩個以上(包含兩個)能夠同時工做的內核,因此就有可能在各個核上運行的任務能同時進行,這就叫作並行編程語言
經過這張圖你應該能更好的理解(串行不在咱們考慮的範圍內)操作系統
同步和異步的概念,通常會涉及到多個任務或事件的參與。能夠在併發或並行的背景下去理解這兩個概念線程
同步指的是併發或並行發生的各任務之間不是孤立獨自運行的,一個任務的進行可能須要在得到另外一個任務的給出的結果以後設計
或者說是隻有一個任務完成或給出一個結果以後,另外一個任務在得到這個結果後才能繼續運行blog
總之,各任務的運行會彼此相互制約,節奏和步調要協調好,不然就會出現錯誤進程
異步指的是併發或並行發生的各任務之間彼此是獨立運行的,不受各自的影響,這是異步與同步最主要的區別
當須要多個任務互相配合在併發或並行環境中合做完成時,就須要以同步的方式運行
操做系統是以信號量機制來實現同步的,各種編程語言也在進行並行或併發程序設計時提供了同步機制
例如Python在多線程設計時的鎖機制
當咱們須要將一個大的任務分解成若干個小的子任務時,各子任務能夠分別獨自完成,彼此之間不須要互相協做,這是就能夠考慮使它們異步地並行或異步地併發執行
這在數據抓取時始終很常見的模式,將若干要抓取的連接分爲幾組,而後對每組分別使用子任務進行抓取,待各子任務抓取結束後,再將結果進行彙總,完成整個任務
關於這些概念大概就是這些,若是不是太明白,能夠本身查閱資料弄明白