无法理解并行计算列表元素的正确方法是什么,但是在不计算元素时阻塞主线程(并行)。用例:我有一个 URL 链接列表和一个简单的 html 页面解析器,我如何通过并行解析每个页面来减少从给定页面获取信息所需的时间,然后返回一个包含一些 JSON 数据的简单列表.
据我了解,我有两种选择:
与期货并行的方式
我有一个在 Future 中提取一些 JSON 数据的方法:
def extractData(link: String): Future[JValue] = // some implementation
我只是将它映射到链接列表上,该类型将是 List[Future[JValue]]:
val res: List[Future[JValue]] = listOfLink.map(extractData)
如果我调用sequence
(例如从 Scalaz 或我自己的实现)遍历此列表并将其转换Future[List[JValue]]
为得到一个List[JValue]
.
尝试使用 ParSeq 进行计算
在这个选项中,我有一个只提取数据的函数:
def extractData(link: String): JValue = // some implementation
但这次呼吁.par
收藏:
val res: ParSeq[JValue] = listOfLinks.map(extractData)
但是通过这种方式,我不太明白如何在不计算孔列表的情况下阻塞主线程,而不按顺序解析每个链接
至于 Akka,我只是不能在这里使用演员,所以只能Future
或Par*