Как сказано в комментариях, Combinatiors.loop
стандартной библиотеки актеров предназначен для того, чтобы уберечь вас от переполнения стека, когда тело актера выполняется повторно.
Но имеет ли смысл использовать loop
для акторов, управляемых событиями (react
), когда обработка сообщений фактически [почти] всегда запланирована для выполнения в выделенном пуле потоков? Простой рекурсивный вызов тела представляется более эффективным вариантом.
Метод Reactor.seq
(вызывается Combinatiors.loop
) определяется следующим образом:
private[actors] def seq[a, b](first: => a, next: => b): Unit = {
val killNext = this.kill
this.kill = () => {
this.kill = killNext
// to avoid stack overflow:
// instead of directly executing `next`,
// schedule as continuation
scheduleActor({ case _ => next }, null)
throw Actor.suspendException
}
first
throw new KillActorControl
}
Предположим, next
вызывается напрямую. В этом случае react
выполняется немедленно, обработка сообщений запланирована , и субъект приостанавливается. Нет места для переполнения стека ...
Где я не прав?