首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解释这个并发的scala代码

解释这个并发的scala代码
EN

Stack Overflow用户
提问于 2014-04-04 04:34:49
回答 3查看 116关注 0票数 0

我找到了这个代码示例,它是用Scala编写的“网络爬虫”的一部分:

代码语言:javascript
运行
复制
 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调用者发送消息?

EN

回答 3

Stack Overflow用户

发布于 2014-04-04 05:16:12

self很可能是对当前参与者(或类似对象)的ActorRef的引用。

caller很可能是对调用参与者的ActorRef的引用(或类似的东西)。

可能没有涉及到PID

Typesafe activator有一些使用Akka的例子

票数 0
EN

Stack Overflow用户

发布于 2014-04-04 05:18:28

self是对包含该执行元的ActorRef实例的引用。

票数 0
EN

Stack Overflow用户

发布于 2014-04-04 21:57:27

正如在Sending messages to functions in Scala的接受答案中所解释的,self当前正在执行执行元。

在第5行,为每个URL创建一个新的参与者,

  • 计算给定url的页面大小
  • 准备一个包含url及其大小的元组
  • 将该元组发送给调用者url

需要caller变量,因为self不能用于在第5行的执行元块中引用当前执行元(getPageSizeConcurrently)。如果使用self而不是caller,如下所示:

代码语言:javascript
运行
复制
actor { self ! (url, PageLoader.getPageSize(url)) }

它指的是那个子角色。

然后在第8行,我们的方法开始等待来自所有创建子参与者的消息。该循环不会终止,直到它接收到urls.size数量的消息。(ReceiveTimeout在这里会很有用)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22848442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档