Насколько я понимаю, по умолчанию, если вы запускаете Kotlin Coroutine через launch
или async
, он запустится через CommonPool
(или если вы используете GlobalScope
).И CommonPool
- это ForkJoinPool
, который по умолчанию находится в не асинхронном режиме, поэтому он выполняет задачи в порядке LIFO.Это выглядит как очень плохой выбор для чего-то вроде асинхронных приложений веб-сервера, где нам нужно честное планирование: мы не хотим, чтобы бедная присоска, которая сначала попала на наш веб-сервер, ждала всех звонков, которые пришли позже.
Однако сопрограммы Kotlin добавляют здесь дополнительную складку, поскольку в стандартной библиотеке Kotlin есть некоторый фрагмент кода, который будет организовывать выполнение этих сопрограмм (некоторые варианты стандартного цикла asyc select / epoll, насколько я понимаю).Так что, возможно, проблема с LIFO не имеет значения?
Я, конечно, мог бы провести некоторые эксперименты и / или перейти к коду в отладчике, чтобы посмотреть, как это работает, но я подозреваю, что у других есть тот же вопрос, и я готов поспорить с кем-то«просто знает» ответ ...