Я працюю над додатком, який відтворює музику.
Під час відтворення часто потрібно щось робити на окремих потоках, оскільки вони мають відбуватися одночасно. Наприклад, ноти акорду потрібно прослуховувати разом, тому кожному присвоюється власна тема для відтворення. (Редагувати, щоб уточнити: виклик note.play()
заморожує нитку, поки нота не буде відтворена, і саме тому мені потрібно три окремі теми, щоб три ноти звучали одночасно.)
Така поведінка створює багато ниток під час відтворення музичного твору.
Наприклад, розглянемо музичний твір з короткою мелодією та короткою супровідною акордовою прогресією. Усю мелодію можна відтворити на одній нитці, але для прогресування потрібно три нитки для відтворення, оскільки кожен її акорд містить три ноти.
Отже, псевдо-код для відтворення прогресії виглядає приблизно так:
void playProgression(Progression prog){
for(Chord chord : prog)
for(Note note : chord)
runOnNewThread( func(){ note.play(); } );
}
Тож якщо припустити, що прогресія має 4 акорди, і ми граємо її двічі, ніж ми відкриваємо 3 notes * 4 chords * 2 times
= 24 теми. І це лише для того, щоб грати в нього один раз.
Насправді це добре працює на практиці. Я не помічаю помітних затримок або помилок, що виникають внаслідок цього.
Але я хотів запитати, чи це правильна практика, чи я роблю щось принципово неправильне. Чи розумно створювати стільки ниток щоразу, коли користувач натискає кнопку? Якщо ні, як я можу це зробити інакше?
Is it reasonable to create so many threads...
залежить від моделі нарізки мови. Нитки, які використовуються для паралелізму, часто обробляються на рівні ОС, тому ОС може зіставити їх на кілька ядер. Такі нитки дорого створюються та перемикаються між собою. Нитки для одночасності (переплетення двох завдань, не обов'язково виконання обох одночасно) можуть бути реалізовані на рівні мови / VM і можуть бути надзвичайно «дешевими» для створення та перемикання між ними, щоб ви могли, скажімо, поговорити з 10 мережевими розетками більше або менше водночас, але вам не обов’язково отримати більше пропускної здатності процесора таким чином.