2014-04-03 93 views
0

我發現這個代碼示例,這是一個「網絡爬蟲」用Scala編寫的一部分:解釋這一併發Scala代碼

 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-process,它使用tupel(url,PageLoader.getPageSize(url))向PID調用者發送消息?

+1

此代碼不能沒有更多的上下文解釋。我的猜測是它使用(不推薦)的Scala演員庫。如果你想使用演員,我建議你使用[Akka](http://akka.io/)。 – EECOLOR

回答

0

self很可能是對當前演員(或類似人物)的ActorRef的引用。

caller很可能是對主叫演員(或類似人物)的ActorRef的引用。

可能沒有涉及PID

Typesafe activator具有使用阿卡

0

self一些實例中是對ActorRef實例的引用包含演員。

0

正如接受的Sending messages to functions in Scalaself回答中所解釋的,當前正在執行演員。

在第5行,爲每個URL創建了一個新的演員,這

  • 計算給定的URL
  • 的頁面大小準備包含URL &它的大小
  • 元組發送該元組給調用者(getPageSizeConcurrently)

caller變量是必需的,因爲self不能用於引用當前actor(getPageSizeConcurrently)內部第5行的演員塊如果self來代替caller,如:

actor { self ! (url, PageLoader.getPageSize(url)) } 

,將參考該子演員。

然後在第8行,我們的方法開始等待所有創建的子actor的消息。直到它接收到urls.size個消息,該循環纔會終止。 (ReceiveTimeout將在這裏有用)