使用循环替代scala actors中的while(true)会发生什么?

7

使用循环与使用while(true)时,使用actors接收消息有什么区别?循环似乎更快,但是为什么?底层发生了什么?

使用循环代替while(true)是否有什么不好的影响?

更多背景信息:我正在对简单的ping/pong代码进行性能测试。我正在使用receive。

这是Ping类:

class ReceivePing(
        count : Int,
        pong : Actor
       ) extends Actor {def act() {
var pingsLeft = count - 1
pong ! Start
pong ! ReceivePing
while(true) {
  receive {
    case ReceivePong =>
      if (pingsLeft % 10000 == 0)
        Console.println("ReceivePing: pong")
      if (pingsLeft > 0) {
        pong ! ReceivePing
        pingsLeft -= 1
      } else {
        Console.println("ReceivePing: stop")
        pong ! Stop
        exit()
      }
  }
}}}

使用循环而不是 while(true) 会更有效率。

谢谢

2个回答

4
while/receive循环会阻塞线程,而loop/react结构则不会。这意味着第一个结构需要每个 actor 一个线程,这很快变得缓慢。
根据Haller and Odersky 2006

等待接收的 actor 不是由阻塞的线程表示,而是由捕获 actor 剩余计算的闭包表示。一旦发送到与接收中指定的消息模式之一匹配的 actor 中,该闭包就会被执行。闭包的执行“搭载”在发送者的线程上。如果接收闭包终止,则返回控制权给发送者,就像过程返回一样。如果接收闭包在第二次接收中阻塞,则通过抛出特殊异常将控制权返回给发送者,该异常展开接收器的调用堆栈。

(显然,后来他们改变了receive的行为,并将旧的receive重命名为react。)

但我说的是带有接收功能的循环,而不是带有反应功能的循环。while/receive和loop/receive之间有什么区别?使用loop/receive会有什么问题吗?它似乎更快。 - Zerdush

3
使用loop释放线程以执行其他任务,而while不会。因此,如果您使用许多actor,则使用loop可以使它们更有效率。另一方面,单个actor使用whilereceive比使用loopreact(或者说,loopreceive)要快得多。

那么这是否意味着“接收”或“响应”对线程没有任何影响呢?“while”和“loop”关键字控制着线程。 - Zerdush
@Zerdush 不,loopreact会对线程产生影响--它们都会释放它。而whilereceive都不会释放线程。 - Daniel C. Sobral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接