es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Las corutinas de Python son sin pila (stackless) o con pila (stackful)?

He visto opiniones contradictorias sobre si las coroutines de Python (principalmente me refiero a async/await) son stackless o stackful.

Algunas fuentes dicen que son stackful:
– http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2074r0.pdf

‘Las coroutines de Python son stackful’.
– https://stackoverflow.com/questions/39675844/how-do-coroutines-in-python-compare-to-those-in-lua
Sí, las coroutines de Python son stackful, de primera clase y asimétricas.

Mientras que otros parecen implicar que son stackless, por ejemplo, https://gamelisp.rs/reference/coroutines.html

Las coroutines de GameLisp siguen el modelo establecido por Rust, Python, C# y C++. Nuestras coroutines son “stackless”.

En general, siempre entendí que cualquier implementación significativa de async/await implica coroutines stackless, mientras que las stackful son básicamente fibras (hilos de espacio de usuario, a menudo conmutados de manera más o menos cooperativa), como goroutines, Boost.Coroutine, aparentemente las de Lua, etc.

¿Mi comprensión es correcta? ¿O las coroutines de Python difieren de alguna manera fundamental de las de C++, y son stackful? ¿O los autores de las fuentes anteriores se refieren a cosas diferentes?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Existe cierta información contradictoria en relación a si las corutinas de Python (específicamente en lo que respecta a async/await) son stackful o stackless. Algunas fuentes sugieren que son stackful, como el artículo encontrado en http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2074r0.pdf que afirma que “las corutinas de Python son stackful”, y una publicación en Stack Overflow (https://stackoverflow.com/questions/39675844/how-do-coroutines-in-python-compare-to-those-in-lua) que indica que las corutinas de Python son “stackful, de primera clase y asimétricas”.

    Sin embargo, otras fuentes sugieren que son stackless, como https://gamelisp.rs/reference/coroutines.html, que afirma que sus corutinas (al igual que en Rust, Python, C# y C++) son “stackless”.

    Parece que hay cierta discrepancia en la definición de lo que constituye una corutina stackful o stackless. En general, una corutina stackful se puede considerar como una fibra o un hilo de espacio de usuario que se cambia de manera cooperativa o no cooperativa, mientras que una corutina stackless normalmente no utiliza una pila separada y puede usar otros métodos para almacenar el estado.

    La implementación de async/await en Python utiliza pilas separadas para cada corutina, lo que indicaría que son stackful. Sin embargo, algunos argumentan que este puede no ser el rasgo definitorio de una corutina stackful, y en su lugar señalan otros factores como el uso de hilos a nivel del sistema o interacciones con el sistema operativo.

    En última instancia, parece que si las corutinas de Python se consideran stackful o stackless depende de la definición de estos términos y los factores que prioricen en su clasificación.

Comments are closed.