Según tengo entendido, de forma predeterminada, si inicia un Kotlin Coroutine a través del launch o async , se iniciará en CommonPool (o si usa GlobalScope ). Y CommonPool es un ForkJoinPool que, de forma predeterminada, está en modo no asíncrono, por lo que ejecuta tareas en orden LIFO. Parece una muy mala elección para algo así como las aplicaciones de servidor web asincrónico en las que queremos una programación justa: no queremos que el pobre tonto que golpeó nuestro servidor web primero espere todas las llamadas que llegaron después.
Sin embargo, las corrutinas de Kotlin agregan una arruga adicional aquí, ya que hay un poco de código de la biblioteca estándar de Kotlin que se encargará de ejecutar esas corrutinas (alguna variación del ciclo asyc select/epoll estándar según lo entiendo). Entonces, ¿quizás lo de LIFO no es una preocupación?
Ciertamente podría ejecutar algunos experimentos y/o ingresar al código en un depurador para ver cómo funciona, pero sospecho que otros tienen la misma pregunta y apuesto a que alguien "simplemente sabe" la respuesta...
Esto no debería ser una preocupación, porque ForkJoinPool no es realmente LIFO.
Es decir, es LIFO para un solo subproceso en el grupo, pero ahí es donde las cosas se vuelven interesantes con la "parte de robo de trabajo". La cola de tareas para cada subproceso tiene doble enlace. Entonces, lo que es LIFO para un subproceso es FIFO para otro subproceso que quedó libre.
En general, ForkJoinPool es una excelente solución para tareas pequeñas y, por lo general, sus corrutinas se consideran pequeñas si usa las funciones de suspensión de manera inteligente.
Además, puede leer más sobre asyncMode en la documentación, ya que no es tan "async": https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html
asyncMode: si es verdadero, establece el modo de programación local primero en entrar, primero en salir para tareas bifurcadas que nunca se unen. Este modo puede ser más apropiado que el modo basado en pila local predeterminado en aplicaciones en las que los subprocesos de trabajo solo procesan tareas asincrónicas de estilo de evento. Para el valor predeterminado, use falso.