Estoy trabajando en una aplicación que reproduce música.
Durante la reproducción, a menudo las cosas deben suceder en subprocesos separados porque deben suceder simultáneamente. Por ejemplo, las notas de una necesidad acorde a ser escuchados juntos, por lo que cada uno se le asigna su propio hilo que se jugará en (Editar para aclarar:. Llamadas note.play()
congela el hilo hasta que la nota es juego de hacer, y es por eso que necesito tres hilos separados para que se escuchen tres notas al mismo tiempo).
Este tipo de comportamiento crea muchos hilos durante la reproducción de una pieza musical.
Por ejemplo, considere una pieza musical con una melodía corta y una breve progresión de acordes. La melodía completa se puede tocar en un solo hilo, pero la progresión necesita tres hilos para jugar, ya que cada uno de sus acordes contiene tres notas.
Entonces el pseudocódigo para reproducir una progresión se ve así:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Asumiendo que la progresión tiene 4 acordes, y lo tocamos dos veces, entonces estamos abriendo 3 notes * 4 chords * 2 times
= 24 hilos. Y esto es solo por jugarlo una vez.
En realidad, funciona bien en la práctica. No noto ninguna latencia notable o errores resultantes de esto.
Pero quería preguntar si esta es una práctica correcta, o si estoy haciendo algo fundamentalmente incorrecto. ¿Es razonable crear tantos hilos cada vez que el usuario presiona un botón? Si no, ¿cómo puedo hacerlo de manera diferente?
Is it reasonable to create so many threads...
depende del modelo de subprocesos del lenguaje. Los subprocesos utilizados para el paralelismo a menudo se manejan a nivel del sistema operativo para que el sistema operativo pueda asignarlos a múltiples núcleos. Tales hilos son caros de crear y cambiar. Los subprocesos para la concurrencia (entrelazando dos tareas, no necesariamente ejecutando ambas simultáneamente) se pueden implementar a nivel de lenguaje / VM y se pueden hacer extremadamente "baratos" para producir y cambiar entre ellos para que pueda, por ejemplo, hablar con 10 enchufes de red más o menos simultáneamente, pero no necesariamente obtendrá más rendimiento de CPU de esa manera.