11

好的,这可能是一个相当愚蠢的问题,但是在参与者框架中使用并行集合有什么好处?也就是说,如果我一次只处理来自参与者邮箱的一条消息,是否还需要并行收集?平行收藏和演员是相互排斥的吗?什么是同时涉及两者的用例?

4

2 回答 2

15

他们解决不同的问题。Actor 擅长解决任务并行问题。而并行集合擅长解决数据并行问题。我不认为它们是相互排斥的——你可以在actors中使用并行集合和包含actors的并行集合。


编辑 - 快速测试:即使是像演员通知循环这样简单的东西也有好处。

在下面的代码中,我们将一百万个演员注册到一个演员注册表,该注册表必须通知他们一个事件。

在我的机器(4 核 2.5 GHz 笔记本电脑)上,非并行通知循环 ( registry foreach {}) 平均需要 2.8 秒。当使用并行收集循环 ( registry.par.foreach {}) 时,它需要 1.2 秒并使用所有四个内核。

import actors.Actor

case class Register(actor: Actor)
case class Unregister(actor: Actor)
case class Message( contents: String )

object ActorRegistry extends Actor{
  var registry: Set[Actor] = Set.empty

  def act() {
    loop{
      react{
        case reg: Register => register( reg.actor )
        case unreg: Unregister => unregister( unreg.actor )
        case message: Message => fire( message )
      }
    }
  }

  def register(reg: Actor) { registry += reg }

  def unregister(unreg: Actor) { registry -= unreg }

  def fire(msg: Message){
    val starttime = System.currentTimeMillis()

    registry.par.foreach { client => client ! msg } //swap registry foreach for single th

    val endtime = System.currentTimeMillis()
    println("elapsed: " + (endtime - starttime) + " ms")
  }
}

class Client(id: Long) extends Actor{
  var lastmsg = ""
  def act() {
    loop{
      react{
        case msg: Message => got(msg.contents)
      }
    }
  }
  def got(msg: String) {
    lastmsg = msg
  }
}

object Main extends App {

  ActorRegistry.start
  for (i <- 1 to 1000000) {
    var client = new Client(i)
    client.start
    ActorRegistry ! Register( client )
  }

  ActorRegistry ! Message("One")

  Thread.sleep(6000)

  ActorRegistry ! Message("Two")

  Thread.sleep(6000)

  ActorRegistry ! Message("Three")

}
于 2011-04-10T01:38:24.660 回答
2

Scala 中的 Actors 库只是众多选项(线程和锁、STM、futures/promises)中的一种选项、并发方法,它不应该用于解决所有类型的问题,或者可以与所有东西结合使用(尽管演员和STM可以一起做一笔好交易)。在某些情况下,设置一组参与者(工人 + 主管)或明确地将任务分成多个部分,以将它们提供给 fork-join 池,这太麻烦了,而且调用.par现有集合更方便您已经在使用并简单地并行遍历它,几乎免费获得性能优势(在设置方面)。

总而言之,参与者和并行集合是问题的不同维度——参与者是一种并发范式,而并行集合只是一个有用的工具,不应将其视为并发替代方案,而应视为集合工具集的扩充。

于 2011-04-10T22:18:40.047 回答