Использование сопрограмм для записи в файл журнала без потери порядка, в котором журналы находятся - PullRequest
3 голосов
/ 08 мая 2020

Я создал специальный регистратор для записи всех моих журналов в файл, а также в журнал android. Поскольку запись файла является блокирующей операцией, я теперь хочу сделать запись файла асинхронной с помощью сопрограмм Kotlin. Просто обернуть запись в сопрограмму не получится, потому что тогда некоторые журналы переключаются и записываются в файл не в правильном порядке. Как я могу убедиться, что журналы записываются последовательно, не блокируя основной поток файловыми операциями, оптимально используя Kotlin сопрограммы?

1 Ответ

3 голосов
/ 08 мая 2020

@ IR42 сказал правильно, вы должны использовать для этой цели каналы.

Используйте Channel и создайте одну сопрограмму, которая приостановлена ​​и ожидает, пока отправитель канала отправит журналы (строки или

Использование канала по умолчанию RendezvousChannel , Когда отправитель отправляет журнал, ожидающая сопрограмма возобновляется, и если другой отправитель отправляет сообщение, то этот следующий отправитель приостанавливается, пока ожидающая сопрограмма не потянет журнал с канала.

Пример, демонстрирующий использование RendezvousChannel

val channel = Channel<String>()    // Channel of Strings
val sendChannel: SendChannel<String> = channel  // Hide that this instance can receive, store this in order to send to this channel

scope.launch(Dispatchers.IO) {
    while (!channel.isClosedForReceive) {
        val log = channel.receive()
        // process the log
    }
}

// Somewhere else
sendChannel.send("Test Log")
...