解释这个并发scala代码
我发现了这个代码示例,它是用Scala编写的web爬虫的一部分:解释这个并发scala代码,scala,concurrency,Scala,Concurrency,我发现了这个代码示例,它是用Scala编写的web爬虫的一部分: def getPageSizeConcurrently() = { val caller = self for (url <- urls) { actor { caller ! (url, PageLoader.getPageSize(url)) } } for (i <- 1 to urls.size) {
def getPageSizeConcurrently() = {
val caller = self
for (url <- urls) {
actor { caller ! (url, PageLoader.getPageSize(url)) }
}
for (i <- 1 to urls.size) {
receive {
case (url, size) =>
println(url + ": " + size)
case _ =>
println("Shouldn't happen")
}
}
}
我想知道我是否做对了
第二行var caller=self是否等于erlangs self,返回一个PID
从actor开始的第五行是创建一个新的actor进程,该进程使用tupelURL PageLoader向PID调用方发送消息。getPageSizeurl?self很可能是对当前actor的ActorRef或类似内容的引用
调用者很可能是对调用者ActorRef的引用或类似的引用
可能不涉及PID
有一些使用Akka的示例self是对包含该参与者的ActorRef实例的引用。如接受答案中所述,self当前正在执行参与者 在第5行,为每个URL创建一个新的参与者,该URL 计算给定URL的页面大小 准备包含url及其大小的元组 当前将此元组发送给调用方GetPageSizeConcurrent 需要调用方变量,因为self不能用于引用第5行actor块中当前的actor GetPageSizeConcurrent。如果使用self而不是调用者,如: 它指的是那个副演员
然后在第8行,我们的方法开始等待来自所有创建的子参与者的消息。该循环在收到URL.size消息数之前不会终止。在这里会很有用如果没有更多的上下文,就无法解释此代码。我猜它使用的是不推荐使用的Scala actor库。如果你想使用演员,我建议你使用。
actor { self ! (url, PageLoader.getPageSize(url)) }