2012-08-28 49 views
3

我最近對學習Scala很感興趣(目前主要通過歐拉項目進行研究),並且我決定編寫一個簡單的程序:一個簡單的併發下載程序。我有一些困難,想把它做好。斯卡拉大衆網址下載

我很熟悉Python,而且我喜歡gevent庫的工作方式。我想要做的是用gevent here解決。有沒有簡單的方法在Scala中做這樣的事情,還是我完全走錯了路?我看了一下Dispatch庫,但看起來難以理解。我應該使用演員嗎?

任何幫助或指導,將不勝感激。謝謝。

+0

Dispatch有什麼問題? – Rogach

+0

除了作者在最新的大升級之後還沒有找到時間提供適當的文檔之外。 – Rogach

+0

如果Dispatch沒有這種奇怪的語法,它會很好。這使得缺乏適當的文檔更令人沮喪。 – deadfoxygrandpa

回答

6

好的,我同意Dispatch文檔目前有點粗糙和小,但是將來可能會改變(這是許多偉大的Scala庫的情況)。

但申請派遣您的需求,結果是壯觀:

import dispatch._ 
(1 to 100).map{ i => 
    Http(url("http://bash.org/?" + i) OK as.String) 
}.map{ f => 
    try {Some(f.apply)} catch {case e => println(e.getMessage); None} 
}.seq.flatten 

這將讓你的第一個100個報價文件從bash.org並行。

+0

謝謝,這種示例非常有幫助! – deadfoxygrandpa

+0

因爲所有URL請求都將並行處理,並且異步調用映射,所以您不需要使用Dispatch 0.9.0的並行集合。我敢打賭平行收藏的開銷會超過收益。相反,像往常一樣做所有事情,然後使用'Promise.all'將承諾的可迭代轉換爲可迭代的承諾,然後應用。 –

+0

@ DanielC.Sobral - Promise.all將如何處理異常?它是否會完全失敗,如果它會從一個潛在的承諾中得到例外? – Rogach