Ich arbeite an einer Anwendung, die Musik spielt.
Während der Wiedergabe müssen häufig Dinge in separaten Threads geschehen, da sie gleichzeitig geschehen müssen. Zum Beispiel, um die Noten eines Akkords Notwendigkeit zusammen gehört werden, so jeder seines eigenen Thread zugeordnet wird gespielt werden (Edit zu klären. Rufenden note.play()
den Faden gefriert , bis die Notiz fertig spielen ist, und das ist , warum ich drei brauchen separate Themen, um drei Noten gleichzeitig zu hören.)
Diese Art von Verhalten erzeugt während der Wiedergabe eines Musikstücks viele Threads.
Betrachten Sie beispielsweise ein Musikstück mit einer kurzen Melodie und einer kurzen Akkordfolge. Die gesamte Melodie kann auf einem einzelnen Thread gespielt werden, für den Verlauf sind jedoch drei Threads erforderlich, da jeder seiner Akkorde drei Noten enthält.
Der Pseudocode zum Abspielen einer Progression sieht also so aus:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Angenommen, die Progression hat 4 Akkorde und wir spielen sie zweimal, dann eröffnen wir 3 notes * 4 chords * 2 times
= 24 Threads. Und das nur, um es einmal zu spielen.
Eigentlich funktioniert es in der Praxis gut. Ich bemerke keine merkliche Latenz oder Fehler, die daraus resultieren.
Aber ich wollte fragen, ob dies die richtige Praxis ist oder ob ich etwas grundlegend Falsches tue. Ist es sinnvoll, jedes Mal so viele Threads zu erstellen, wenn der Benutzer einen Knopf drückt? Wenn nicht, wie kann ich das anders machen?
Is it reasonable to create so many threads...
hängt vom Threading-Modell der Sprache ab. Threads, die für die Parallelität verwendet werden, werden häufig auf Betriebssystemebene verarbeitet, damit das Betriebssystem sie mehreren Kernen zuordnen kann. Solche Threads sind teuer zu erstellen und zwischen ihnen zu wechseln. Threads für die Parallelität (Verschachtelung von zwei Tasks, die nicht unbedingt beide gleichzeitig ausführen müssen) können auf Sprach- / VM-Ebene implementiert werden und sind extrem "billig" zu produzieren und zu wechseln, sodass Sie beispielsweise mehr oder weniger mit 10 Netzwerk-Sockets sprechen können gleichzeitig, aber auf diese Weise erhalten Sie nicht unbedingt mehr CPU-Durchsatz.