解释这个并发scala代码

解释这个并发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) {       

我发现了这个代码示例,它是用Scala编写的web爬虫的一部分:

 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)) }