Я хотел сравнить актеров akka с kotlin.Имея некоторое базовое понимание kotlin, я попробовал простой тест с пинг-понгом, и программа застряла.Это только прогрессировало до завершения, только когда я сделал размер емкости таким же, как количество сообщений.При моем понимании оба актера должны продолжать выполнять свою работу и не должны зависеть от способностей.
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.SendChannel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.runBlocking
sealed class Message
class Ping(val replyTo: SendChannel<Message>) : Message()
object Pong : Message()
object Start : Message()
fun CoroutineScope.PingActor() = actor<Message>(capacity = 10) {
for (msg in channel) {
when (msg) {
is Ping ->
msg.replyTo.send(Pong)
}
}
}
fun CoroutineScope.PongActor(pinger: SendChannel<Message>, count: Int, done: CompletableDeferred<Unit>) =
actor<Message> (capacity = 10){
var counter = count
for (msg in channel) {
when (msg) {
is Start ->
for (i in 1..count) {
pinger.send(Ping(this.channel))
}
is Pong -> {
counter -= 1
if (counter == 0) {
done.complete(Unit)
}
}
}
}
}
fun main() = runBlocking<Unit> {
val response = CompletableDeferred<Unit>()
val pinger = PingActor()
val ponger = PongActor(pinger, 100, response)
val startTime = System.nanoTime()
ponger.send(Start)
response.await()
println("total time taken is ${System.nanoTime() - startTime}")
pinger.close()
ponger.close()
}