【发布时间】:2022-01-18 17:21:34
【问题描述】:
我需要帮助了解 Actor 系统如何使用 ForkJoinPool 并维护排序保证。
我一直在玩 Actr https://github.com/zakgof/actr,这是一个简单的小型演员系统。我认为我的问题也适用于 Akka。我有一段简单的代码可以发送一个演员号码 1 到 10。演员只是打印消息;并且消息不按顺序排列。我得到 1,2,4,3,5,6,8,7,9,10。
我认为这与 ForkJoinPool 有关。 Actr 将消息包装到 Runnable 中并将其发送到 ForkJoin Executor。当任务执行时,它会将消息放到目标 Actor 的队列中并对其进行处理。我对 ForkJoinPool 的理解是任务被分配到多个线程。我添加了日志记录,消息 1,2,3,... 被分发到不同的线程,消息被乱序放入 Actor 的队列中。
我错过了什么吗? Actr 的 Scheduler 类似于 Akka 的 Disapatcher,可以在这里找到:https://github.com/zakgof/actr/blob/master/src/main/java/com/zakgof/actr/impl/ExecutorBasedScheduler.java
ExecutorBasedScheduler 使用 ForkJoinPool.commonPool 构造,如下所示:
public static IActorScheduler newForkJoinPoolScheduler(int throughput) {
return new ExecutorBasedScheduler(ForkJoinPool.commonPool(), throughput);
}
Actor 如何使用 ForkJoinPool 并保持消息有序?
【问题讨论】:
标签: akka actor forkjoinpool