2014-08-30 79 views
3

我正在從(降序)時間有序庫中下載圖像。我想停下來,當我們看到已經停下來的照片時。從線程循環中突破

require 'thread/pool' 

def getimg(uri) 
#... 
    if File.exist? filename 
    raise "Already done." # something like this 
    end 
#... 
end 

pool = Thread.pool(4) 

thumbs.each do |a| 
    pool.process { 
    getimg(URI(a.attr('href'))) 
    } 
end 

回答

2

傳遞池對象並使用pool.shutdown怎麼樣?

require 'thread/pool' 

def getimg(uri, pool) # <---- 
#... 
    if File.exist? filename 
    pool.shutdown # <-------- 
    return   # <------ 
    end 
#... 
end 

pool = Thread.pool(4) 

thumbs.each do |a| 
    pool.process { 
    getimg(URI(a.attr('href')), pool) # <---- 
    } 
end 

根據the Thread::Pool#process code comment

關閉池,它會阻止,直到所有任務完成運行。

UPDATE

使用shutdown!代替shutdown

已關閉!立即關閉游泳池而不完成執行任務。

+0

這聽起來不錯,但似乎並不奏效。我試過修剪!太。 – Kambus 2014-08-30 14:17:36

+0

@Kambus,我嘗試了這一點,它按預期工作。這是我的實驗:http://pastebin.com/fgSw6BZT – falsetru 2014-08-30 14:19:03

+0

嗯,這很奇怪!我必須在File.exist之前獲得一個頁面才能知道文件名,並且不管pool.shutdown如何都會運行。嘗試在文件檢查之前添加pri:http://pastebin.com/i7mb3PXQ – Kambus 2014-08-30 14:47:19