2012-08-28 51 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