Имейте в виду, что код launch
ed совпадает с кодом вне его. Это означает, что то, что вы написали, имеет условие гонки: внешний код, возможно, уже назначил новое задание на saveJob
, когда вы пытаетесь join()
его, что приводит к тупику.
Я думаю, что вы хотитеэто вызвать save
операцию в фоновом режиме, и сама операция извлечет все данные для сохранения из другого места. Возможно, вам не нужна очередь из save
заданий, просто убедитесь, что все сохранено в точке, которую вы называете save()
. Если вы позвонили save
чуть раньше, а новое задание сохранения еще не началось, эти два вызова можно объединить в одну операцию save
.
Кроме того, вы говорите, что у вас есть приостановка операция базы данных. Приостановленный код не входит в диспетчер IO
, который есть только в том случае, если вам нужно одновременно выполнять много операций , блокирующих .
Все, что я предложил бы использовать актера:
val actor = someScope.actor<Unit>(capacity = CONFLATED) {
// suspending database operation
}
fun save() = someScope.launch {
actor.send(Unit)
}