矽谷之路45:如何設計Crawler(二)多線程並發設計
查看完整視頻:http://www.bittiger.io/classes
面對如何設計分散式爬蟲的問題,我們首先將其抽象為生產者/消費者模型,然後分別使用睡眠(sleep)、條件變數(conditional variable)、信號量(semaphore)給出了三種解法。最後也推薦大家去深度學習LMAX Disruptor這套最快的無鎖生產者消費者的模型。這篇乾貨超級多,多線程大全!含睡眠(Sleep),條件變數(Conditional Variable),信號量(Semaphore),先mark一下!
上一次我們已經講了Crawler的設計,得到了圖中這個架構。Scheduler負責調度Crawler,給Crawler分配任務。那麼Scheduler是如何進行調度的呢?每個Crawler是一個線程,所以這就是一個多線程的問題。先講睡眠(Sleep)。Crawler共享taskTable和pageTable,Crawler從taskTable獲取任務,將爬到的頁面寫入pageTable,如果頁面里包含新的url需要爬取,就將新的url寫入taskTable。
過程是這樣的,首先Crawler去taskTable查看一下有沒有任務,如果沒有任務就睡一秒再查看,直到有新的任務。有新的任務就執行新的任務,將爬到的page寫到pageTable里,如果有新的task就寫到taskTable里。
因為table是共享的,如果多個線程同時讀寫肯定有問題,所以就要給table加鎖,讀寫完畢後要釋放鎖。
睡眠的問題是什麼呢?睡眠比較死板,說睡一秒就睡一秒,如果一秒之中有新的任務來也不能立即執行。所以有沒有一個鬧鐘的機制,如果有新任務來就把Crawler喚醒呢?有的,用條件變數(Conditional Variable)。
t看紅字的部分,如果沒有新任務,就進入Cond_Wait,這個線程就被block掉,直到有新任務產生,觸發了Cond_Signal,就會喚醒等待的線程。
再看信號量(Semaphore),信號量是簡化的條件變數。設定新任務數為信號量,當新任務數小於等於零時,表示沒有新任務,進入Wait;否則有新任務,就執行新任務。當有新任務產生時就更改信號量,然後Signal。
本文整理作者:Mengying Tian,查看完整視頻:http://www.bittiger.io/classes
更多內容,請訪問:BitTiger.io, 掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」
推薦閱讀:
※[R]利用R Markdown生成爬蟲分析報告
※教你輕鬆爬取Air-Level網站的城市地區數據
※你眼中的我
※左手用R右手Pyhon系列——趣直播課程抓取實戰