Saya sedang mengerjakan aplikasi yang memutar musik.
Selama pemutaran, seringkali hal-hal perlu terjadi pada utas terpisah karena mereka perlu terjadi secara bersamaan. Misalnya, nada chord perlu didengarkan bersama, sehingga masing-masing diberi utas sendiri untuk dimainkan. (Edit untuk memperjelas: memanggil note.play()
membekukan utas sampai not selesai dimainkan, dan inilah mengapa saya perlu tiga pisahkan utas agar tiga nada terdengar pada saat bersamaan.)
Perilaku semacam ini menciptakan banyak utas selama pemutaran karya musik.
Sebagai contoh, perhatikan musik dengan melodi pendek dan progresi akor pendek. Keseluruhan melodi dapat dimainkan pada satu utas, tetapi progresi membutuhkan tiga utas untuk dimainkan, karena masing-masing akornya berisi tiga not.
Jadi pseudo-code untuk memainkan progresi terlihat seperti ini:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Jadi dengan anggapan progres memiliki 4 akor, dan kami memainkannya dua kali, daripada yang kami buka 3 notes * 4 chords * 2 times
= 24 utas. Dan ini hanya untuk memainkannya sekali saja.
Sebenarnya, itu berfungsi dengan baik dalam praktek. Saya tidak melihat adanya latensi yang terlihat, atau bug yang dihasilkan dari ini.
Tetapi saya ingin bertanya apakah ini praktik yang benar, atau apakah saya melakukan sesuatu yang secara fundamental salah. Apakah masuk akal untuk membuat begitu banyak utas setiap kali pengguna menekan tombol? Jika tidak, bagaimana saya bisa melakukannya secara berbeda?
Is it reasonable to create so many threads...
tergantung pada model threading bahasa. Thread yang digunakan untuk paralelisme sering ditangani pada level OS sehingga OS dapat memetakannya ke beberapa core. Utas semacam itu mahal untuk dibuat dan dialihkan. Utas untuk konkurensi (interleaving dua tugas, tidak harus menjalankan keduanya secara bersamaan) dapat diimplementasikan pada tingkat bahasa / VM dan dapat dibuat sangat "murah" untuk menghasilkan dan beralih di antara sehingga Anda dapat, katakanlah, berbicara dengan 10 soket jaringan lebih atau kurang secara bersamaan, tetapi Anda tidak perlu mendapatkan lebih banyak CPU throughput seperti itu.