加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala 2.9和演员平行收藏

发布时间:2020-12-16 09:01:19 所属栏目:安全 来源:网络整理
导读:好的,这可能是一个相当愚蠢的问题,但是在actor框架内使用并行集合的好处是什么?也就是说,如果我只是从一个演员的邮箱处理一个消息,那么甚至需要一个并行收集?平行收藏和演员是否相互排斥?什么是涉及这两种情况的用例? 解决方法 他们解决不同的问题.演员
好的,这可能是一个相当愚蠢的问题,但是在actor框架内使用并行集合的好处是什么?也就是说,如果我只是从一个演员的邮箱处理一个消息,那么甚至需要一个并行收集?平行收藏和演员是否相互排斥?什么是涉及这两种情况的用例?

解决方法

他们解决不同的问题.演员善于解决 task parallel problems.虽然并行集合很好地解决了 data parallel problems.我不认为它们是相互排斥的 – 您可以在actor中使用并行集合并包含actors的并行集合.

编辑 – 快速测试:
即使是像演员通知循环一样简单的好处.

在下面的代码中,我们向一个actor注册表注册了一百万个actor,该注册表必须通知他们一个事件.

非平行通知循环(注册表foreach {})在我的机器(4核2.5 GHz笔记本)上平均需要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")

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读