Scala 在多代理系统中增强同步性

Scala 在多代理系统中增强同步性,scala,akka,agent,Scala,Akka,Agent,为了学习scala和akka,我正在写一个战舰游戏。我还没有真正开始编写任何代码,我只是在思考如何工作 我有船只和玩家舰队的代理,还有诸如“射击”、“命中”、“未命中”、“所有船只均已死亡”之类的消息。我的第一个绊脚石是,当玩家1射门时,它会产生一系列事件,而玩家2必须等到所有事情都解决后,才能开始他的回合。我怎样才能确定呢?我想也许我总是会发送一个回复,不管发生什么,然后计算一个发送者收到的回复和发送的信息一样多。也许战舰不是代理的最佳候选应用程序 这也带来了一个问题,即由于消息尚未处理,代理

为了学习scala和akka,我正在写一个战舰游戏。我还没有真正开始编写任何代码,我只是在思考如何工作

我有船只和玩家舰队的代理,还有诸如“射击”、“命中”、“未命中”、“所有船只均已死亡”之类的消息。我的第一个绊脚石是,当玩家1射门时,它会产生一系列事件,而玩家2必须等到所有事情都解决后,才能开始他的回合。我怎样才能确定呢?我想也许我总是会发送一个回复,不管发生什么,然后计算一个发送者收到的回复和发送的信息一样多。也许战舰不是代理的最佳候选应用程序


这也带来了一个问题,即由于消息尚未处理,代理没有回复任何内容,或者代理死亡,所以没有收到答复。但是我会把这个留到以后再做。

这里有很多事情你可能想做:

  • 让第一个参与者接收对其每条消息的回复,然后向第二个参与者发送轮到你的消息

  • 向第二个参与者发送一条消息,指示在给定回合中必须接收多少事件

这些目标可实现如下:

import akka.pattern._
(d1 ? m1) zip (d2 ? m2) pipeTo that
在上面的示例中,
d1/2
是目标参与者,
m1/2
是要发送的消息。来自这些参与者的回复被压缩在一起(变成
Tuple2
),并转发给第二个参与者(
,在本例中为

第二种机制更为复杂;我使用
SyncPoints
编写了类似的东西。比如说:

case class SyncPoint(id: UUID, participants: ActorRef*)
object SyncPoint {
  def newFor(participants: ActorRef*) = SyncPoint(UUID.createRandomUUID, participants)
}
然后,消息的创建者首先向最终观察者发送一个同步点

val sync = SyncPoint.newFor(d1, d2)
that ! sync
现在,最终接收者知道它希望每个参与者都能在这个
同步点上收到一条消息

d1 ! SyncPart(m1, sync)
d2 ! SyncPart(m2, sync)
在哪里

case class SyncPart(msg: Any, sync: SyncPoint)
参与者
d1
d2
处理完消息中的角色后,将转发到

case class SyncPartial(sync: SyncPoint, participant: ActorRef)

通过这种方式,
知道它正在等待来自多个参与者的消息,然后可以跟踪这些参与者何时执行了处理。

谢谢。我想我会采用第一种方法,因为我不知道会生成多少个事件。