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秒. 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") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |