像網路爬蟲、資料庫等方面多線程程序如何設置線程數?

公司有一套爬蟲系統,用特定關鍵字在搜索引擎上搜索(如Google,百度),流程大致上,從資料庫批量取出關鍵字,然後生成相關搜索引擎的搜索任務,扔到Queue裡面,後面一群消費者去爬。

多線程的,我想知道如何去設置合理的線程數?

PS:像資料庫有最大連接數控制,所以並發數還好控制。沒有這種限制,我就不會從IO、CPU方面分析了。


公司技術諮詢按小時收費。


爬蟲這種IO密集型,而且是對外網的請求,如果需求的QPS 超過500/s,就用erlang,golang或者其他語言的epoll庫。否則就啟N個consumer線程處理就好了。爬百度的數據,一個機器的ip肯定是不夠的,先從淘寶上買一堆的http代理肉雞ip回來再搞。
你這個需求,處理好http代理的問題(設置每個ip的使用間隔放置被ban),
io方面如果超過500的QPS需求,利用erlang actor 是比較好的選擇,如果怕學習成本,可以使用其他語言(java 的nio, c++的libevent的http模塊,或者各個語言的epoll封裝) 都可以很好的解決。如果QPS比較低,可以開N個線程或者線程池處理,注意線程數不要大於( ulimit -u)

CPU方面,爬蟲服務本身,即使是QPS上一千,一個核心基本可以搞定,不需要考慮CPU消耗,如果爬回來的數據需要進行處理,建議使用libxml庫,網頁解析是CPU密集型的,建議在生產環境測試一下解析性能。


推薦閱讀:

UDP socket能否被多線程同時調用sendto來發送數據?
Linux 開發,使用多線程還是用 IO 復用 select/epoll?
如何修改shared_ptr智能指針,讓他支持多線程?
開發多線程的程序應該注意哪些問題?

TAG:編程 | 並發峰值 | 多線程 | 網頁爬蟲 |