1

我正在構建一個分佈式Web爬蟲,並試圖最大限度地利用每臺單機的資源。我通過Iterator在EventMachine中運行解析函數,並使用em-http-request發出異步HTTP請求。現在我有100次迭代同時運行,看起來我無法超越這個級別。如果我增加一些迭代次數,它不會影響抓取速度。然而,我只有10-15%的CPU負載和20-30%的網絡負載,所以有足夠的空間抓取更快。EventMachine:EM可以處理的並行HTTP請求的最大數量是多少?

我正在使用Ruby 1.9.2。有沒有什麼辦法來改善代碼以有效地使用資源,或者我甚至做錯了?

def start_job_crawl  
    @redis.lpop @queue do |link| 
    if link.nil?     
     EventMachine::add_timer(1){ start_job_crawl() } 
    else 
     #parsing link, using asynchronous http request, 
     #doing something with the content       
     parse(link) 
    end   
    end   
end 

#main reactor loop 

EM.run { 
EM.kqueue 

@redis = EM::Protocols::Redis.connect(:host => "127.0.0.1") 
@redis.errback do |code| 
    puts "Redis error: #{code}" 
end 

#100 parallel 'threads'. Want to increase this  

    EM::Iterator.new(0..99, 100).each do |num, iter| 
     start_job_crawl()  
    end 
} 

回答

2

如果你正在使用選擇()(這是EM默認),最多的是1024,因爲選擇()僅限於1024個文件描述符。

但是看起來好像你正在使用kqueue,所以它應該能夠一次處理遠遠超過1024個文件描述符。

0

這是你的EM.threadpool_size的值嗎?
嘗試擴大它,我懷疑限制是不是在kqueue,但在處理請求池...

相關問題