标签: actor

Scala actor可以同时处理多条消息吗?

回复到我最近的问题表明,一个演员处理其消息一次一个.这是真的?我没有看到任何明确说明(在Scala编程),其中包含以下代码段(第593页)

如果[ react方法]找到可以处理的消息,[it]将调度该消息的处理以便以后执行并抛出异常

(强调我自己).两个相关(和互斥)的问题:

  1. 假设演员可以同时处理多个消息,我怎样才能强制演员一次处理消息1(如果这是我想做的话)?(用receive?)
  2. 假设一个actor一次处理一个消息,我怎样才能最好地实现一个实际上可以同时处理消息的actor

编辑:做一些测试似乎证明我错了,演员确实是连续的.所以问题#2我需要回答

concurrency scala actor

28
推荐指数
2
解决办法
5178
查看次数

Clojure的代理人如何与Scala的演员比较?

我在Scala(源代码)(Scala 2.8 RC7)和Clojure(源代码)(Clojure 1.1)中编写了一个环网络拓扑模拟,用于比较Actors和Agents.

虽然Scala版本显示几乎恒定的消息交换率,因为我将网络中的节点数从100增加到1000000,但Clojure版本显示的消息速率随着节点数量的增加而减少.同样在单次运行期间,Clojure版本中的消息速率随着时间的推移而降低.

所以我很好奇Scala的演员如何与Clojure的特工比较?Agent本身是否比Actors更少并发或代码编写效率低(autoboxing?)?

PS:我注意到Scala版本中的内存使用量随着节点数量的增加(100万个节点> 500 MB)而增加很多,而Clojure版本使用的内存要少得多(100万个节点约100 MB).

编辑:

这两个版本都在相同的JVM上运行,并且所有JVM参数和Actor和Agent配置参数都设置为默认值.在我的机器上,Scala版本为100到100万个节点提供了大约5000个消息/秒的消息速率,而Clojure版本以100个节点的60000消息/秒开始,对于100万个节点减少到200个消息/秒.

编辑2

事实证明我的Clojure版本编写效率低下.我将nodes集合的类型更改listvector,现在它显示了一致的行为:100个节点100000消息/秒,100000个节点80000消息/秒.所以Clojure Agent似乎比Scala Actors更快.我也更新了链接的来源.

concurrency scala clojure agents actor

27
推荐指数
1
解决办法
5394
查看次数

Akka中Typed和UnTyped Actors有什么区别?什么时候用?

我试图阅读Akka文档,找出Typed和Untyped actor之间的确切区别.什么时候用?我不确定我错过了什么.有人可以指点我相关的东西或者在这里提供这个问题的答案吗?

java actor akka

27
推荐指数
1
解决办法
9754
查看次数

将ActorRef传递给其他Actors好坏?

我试图弄清楚我将Akka传递ActorRef给其他演员的用法是不是反模式.

我的系统里有几个演员.有些人长寿(restClientRouter,publisher),有些人在完成工作后死亡(geoActor).短命的演员需要向长寿演员发送信息,因此需要他们ActorRef的.

  //router for a bunch of other actors
  val restClientRouter = createRouter(context.system)

  //publishers messages to an output message queue
  val publisher: ActorRef = context.actorOf(Props(new PublisherActor(host, channel)), name = "pub-actor")     

  //this actor send a message to the restClientRouter and then sends the response
  //to the publisher 
  val geoActor = context.actorOf(Props(new GeoInferenceActor(restClientRouter, publisher)), name = "geo-inference-actor")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将ActorRefs(restClientRouterpublisher)传递给了构造函数GeoInferenceActor.这样可以吗?有没有更好的方法呢?

design-patterns scala anti-patterns actor akka

26
推荐指数
2
解决办法
4643
查看次数

libgdx中Actor的动作

我已经成为了我的演员,但我不清楚如何利用这些actionact方法.在基本的Javadoc之外,我还没有找到关于这些方法的好教程.

任何人都可以提供一个关于演员行动评论的例子吗?

android action actor libgdx

22
推荐指数
3
解决办法
3万
查看次数

基于Actor的webservice - 如何正确地完成它?

在过去的几个月里,我和我的同事已经成功构建了一个服务器端系统,用于向iPhone设备发送推送通知.基本上,用户通过RESTful webservice(Spray-Server,最近更新为使用Spray-can作为HTTP层)注册这些通知,并且逻辑使用Akka的调度程序调度一个或多个消息以便将来调度.

这个系统,正如我们构建的那样,简单地工作:它可以每秒处理数百甚至数千个HTTP请求,并且可以以每秒23,000的速率发送通知 - 如果我们减少日志输出,可能会更多,添加多个通知发送方actor(以及与Apple的更多连接),并且可能在我们使用的Java库(java-apns)中进行一些优化.

这个问题是关于如何做对的(tm).我的同事,更了解Scala和基于演员的系统,注意到应用程序不是一个"纯粹的"基于演员的系统 - 他是对的.我现在想知道的是如何正确地做到这一点.

目前,我们有一个Spray HttpServiceactor,而不是子类,用一组指令来初始化,这些指令概述了我们的HTTP服务逻辑.目前,非常简化,我们有这样的指令:

post {
  content(as[SomeBusinessObject]) { businessObject => request =>
    // store the business object in a MongoDB back-end and wait for the ID to be
    // returned; we want to send this back to the user.
    val businessObjectId = persister !! new PersistSchedule(businessObject)
    request.complete("/businessObject/%s".format(businessObjectId))
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我做对了,那么来自演员的'等待回应'就是基于演员的编程中的禁忌(加上!!已被弃用).我认为"正确"的方法是将request对象传递persister给消息中的actor,并在request.complete从后端收到生成的ID后立即调用它.

我已经在我的应用程序中重写了其中一条路线来做这件事; 在发送给actor的消息中,还发送请求对象/引用.这看起来像是应该的:

  content(as[SomeBusinessObject]) { businessObject => request =>
    persister ! new …
Run Code Online (Sandbox Code Playgroud)

scala actor akka spray

22
推荐指数
1
解决办法
4149
查看次数

何时在libgdx中使用actor?有什么缺点和优点?

我正在写简单的太阳系模拟器.这是我的第一个libgdx项目.我在主菜单上使用舞台和演员,非常方便,特别是触摸事件处理.但是......看看这些例子,我看到没有人在实际的游戏逻辑中使用演员.如果我应该使用演员作为星球的父母,或者只是写我自己的班级,我会徘徊.行星将不会被触摸,它们将仅在帧之间移动,因此动作MoveBy的第三个参数必须是帧之间的时间.这是缺点.使用Actors的优点是什么?

java android stage actor libgdx

22
推荐指数
1
解决办法
1万
查看次数

AMQP和ZeroMQ之间的差异

最近开始研究这些AMQP(RabbitMQ,ActiveMQ)和ZeroMQ技术,对分布式系统/计算感兴趣.一直在谷歌搜索和StackOverflow'周围,找不到两者之间的明确比较.

我得到的最远的是两者不太可比,但我想知道差异.在我看来ZeroMQ更加分散(没有消息经纪人在播放中间人处理消息/ guarenteering交付)并且因此更快,但并不意味着是一个完全成熟的系统,而是需要以编程方式处理的事情,比如演员.

另一方面,AMQP似乎是一个更完善的系统,中央消息代理确保可靠的交付,但由于这一点,比ZeroMQ慢.但是,中央经纪人会造成单点故障.

也许比喻是客户/服务器与P2P?

我的发现是真的吗?另外,使用一个优于另一个的优点,缺点或用例是什么?比较使用*MQ与像Akka Actors这样的东西也会很好.

编辑多看了一下.. ZeroMQ似乎是AMQP的新竞争者,似乎要快得多,唯一的问题是采用/实现?

distributed-computing amqp zeromq actor

22
推荐指数
3
解决办法
1万
查看次数

将典型的3层架构转移给演员

这个问题困扰了我一段时间了(我希望我不是唯一的一个).我想采用一个典型的3层Java EE应用程序,看看它可能看起来像是用actor实现的.我想知道是否真的有意义进行这样的转换以及如果它确实有意义我可以从中获利(可能是性能,更好的架构,可扩展性,可维护性等等).

这是典型的Controller(演示),服务(业务逻辑),DAO(数据):

trait UserDao {
  def getUsers(): List[User]
  def getUser(id: Int): User
  def addUser(user: User)
}

trait UserService {
  def getUsers(): List[User]
  def getUser(id: Int): User
  def addUser(user: User): Unit

  @Transactional
  def makeSomethingWithUsers(): Unit
}


@Controller
class UserController {
  @Get
  def getUsers(): NodeSeq = ...

  @Get
  def getUser(id: Int): NodeSeq = ...

  @Post
  def addUser(user: User): Unit = { ... }
}
Run Code Online (Sandbox Code Playgroud)

你可以在许多弹簧应用中找到类似的东西.我们可以采用没有任何共享状态的简单实现,因为没有同步块...所以所有状态都在数据库中,应用程序依赖于事务.服务,控制器和dao只有一个实例.因此,对于每个请求,应用程序服务器将使用单独的线程,但线程不会相互阻塞(但将被DB IO阻止).

假设我们正在尝试与actor实现类似的功能.它看起来像这样:

sealed trait UserActions
case class GetUsers extends UserActions
case class GetUser(id: Int) extends UserActions …
Run Code Online (Sandbox Code Playgroud)

spring scala 3-tier java-ee actor

21
推荐指数
3
解决办法
2394
查看次数

为什么scala actor在2.10中被弃用了?

我只是在比较不同的scala actor实现,现在我想知道在2.10中弃用现有scala actor实现并用Akka实现替换默认actor的动机是什么?迁移指南和第一个公告都没有给出任何解释.

根据比较,两种解决方案的不同之处在于保持两种解决方案都是有益的.因此,我想知道导致这一决定的现有实施是否存在任何重大问题?换句话说,这是技术还是政治决定?

scala actor akka scala-2.10

21
推荐指数
1
解决办法
4377
查看次数