never - asyncio python tutorial
¿Cómo mejoran las coroutinas el rendimiento? (2)
He estado viendo muchas charlas y artículos sobre coroutines en python. Se consideran "microtensiones" y he oído que mejoran el rendimiento.
¿Cómo mejoran las coroutinas el rendimiento? Por lo que he visto hasta ahora, son de un solo hilo y se ejecutan en secuencia. Estoy de acuerdo en que, desde una perspectiva de diseño, son bastante elegantes, especialmente en aplicaciones de tipo productor / consumidor.
Supongo que me estoy perdiendo el punto. ¿Alguien puede ayudar a explicar?
Coroutines realmente no mejora el rendimiento, excepto en un sentido muy limitado: los programas de subprocesos múltiples tienen una cierta sobrecarga y las corrutinas proporcionan parte de la ventaja de los subprocesos sin incurrir en esas sobrecargas. Sin embargo, la mayoría de las aplicaciones de subprocesos múltiples (incluso en C-Python con su GIL) se benefician de la superposición cuando un subproceso se bloquea en una llamada del sistema y otros subprocesos pueden ejecutarse: eso no ocurre generalmente con las rutinas.
Si tiene algunos hilos, por lo general, la superposición gana y las corrutinas no ofrecen beneficios de rendimiento. Si necesita miles de subprocesos, entonces la sobrecarga del cambio de subprocesos será mucho mayor y, en esa situación, las rutinas pueden dar un beneficio, pero reducir el número de subprocesos es mucho más beneficioso.
La verdadera ventaja de las corrutinas es que para las aplicaciones productor / consumidor hacen que la codificación sea mucho más simple y, por lo tanto, más rápida de codificar.
Esta es una buena pregunta, me recordó a Un curso curioso de David Beazley sobre coroutines y concurrencia . David hace un excelente trabajo no solo explicando cómo funcionan las coroutinas en Python, sino también los casos de uso en los que realmente están en el bolsillo.
Su escritura parece indicar que el beneficio de rendimiento proviene de tener menos gastos generales para realizar las mismas tareas para las que normalmente usaría una clase de manejador (consulte la diapositiva 51 de su presentación ).
Entonces, como sugiere la respuesta de @Duncan, las situaciones en las que los gastos generales son importantes (como tener muchos hilos), las coroutinas son una ganancia de rendimiento, pero las coroutinas son mucho más que solo el rendimiento.