我找到了这个代码示例,它是用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调用者发送消息?
发布于 2014-04-04 05:16:12
self
很可能是对当前参与者(或类似对象)的ActorRef
的引用。
caller
很可能是对调用参与者的ActorRef
的引用(或类似的东西)。
可能没有涉及到PID
。
Typesafe activator有一些使用Akka的例子
发布于 2014-04-04 05:18:28
self
是对包含该执行元的ActorRef实例的引用。
发布于 2014-04-04 21:57:27
正如在Sending messages to functions in Scala的接受答案中所解释的,self
当前正在执行执行元。
在第5行,为每个URL创建一个新的参与者,
需要caller
变量,因为self不能用于在第5行的执行元块中引用当前执行元(getPageSizeConcurrently)。如果使用self
而不是caller
,如下所示:
actor { self ! (url, PageLoader.getPageSize(url)) }
它指的是那个子角色。
然后在第8行,我们的方法开始等待来自所有创建子参与者的消息。该循环不会终止,直到它接收到urls.size数量的消息。(ReceiveTimeout在这里会很有用)
https://stackoverflow.com/questions/22848442
复制相似问题