Моє запитання: який тип програми вимагає стільки одночасних потоків виконання?
1) Той факт, що мова "важить" означає, що є менше шансів, що вам доведеться скинути цю мову, коли все стане складніше в дорозі. (Це називається концепцією "Весь продукт".) Багато людей кидають Apache на Nginx саме з цієї причини. Якщо ви десь близькі до "жорсткої межі", накладеної накладними потоками, ви злякаєтесь і почнете думати про способи подолати це. Веб-сайти ніколи не можуть передбачити, скільки трафіку вони отримають, тому витратити трохи часу на те, щоб змінити масштабованість.
2) Одна програма на запит лише на початку. Існує маса причин використовувати горотини всередину.
- Розглянемо веб-додаток з одночасними запитами 100, але кожен запит генерує 100 запитів із зворотнього зв'язку. Очевидний приклад - агрегатор пошукових систем. Але майже будь-яка програма може створювати програми для кожної "області" на екрані, а потім генерувати їх самостійно, а не послідовно. Наприклад, кожна сторінка на Amazon.com складається з 150+ додаткових запитів, зібраних саме для вас. Ви не помічаєте, оскільки вони паралельно, а не послідовні, і кожна "область" - це власна веб-служба.
- Розгляньте будь-яку програму, де надійність та затримка є першорядними. Ви, мабуть, хочете, щоб кожен вхідний запит знімав декілька запитів, що повертаються , і повертати будь-які дані, що повертаються першими .
- Розгляньте будь-яке "приєднання клієнта", яке виконується у вашому додатку. Замість того, щоб сказати "для кожного елемента, отримати дані", ви можете розкрутити купу горотин. Якщо у вас є купа рабних БД для запиту, ви чарівно пройдете N час швидше. Якщо цього не зробити, це не буде повільніше.
зменшення повернень повертається, коли кількість потоків / процесів значно більше, ніж кількість фізичних ядер
Продуктивність не єдина причина розбиття програми на CSP . Це насправді може полегшити розуміння програми, а деякі проблеми можна вирішити набагато менше коду.
Як і у слайдах, зв'язаних вище, сумісність у вашому коді є способом організації проблеми. Не мати гороутин - це не мати структури даних Map / Dictonary / Hash на вашій мові. Ви можете обійтись без цього. Але як тільки у вас є, ви починаєте використовувати його скрізь, і це дійсно спрощує вашу програму.
У минулому це означало "прокатати своє" багатопотокове програмування. Але це було складно і небезпечно - все ще не так багато інструментів, щоб переконатися, що ви не створюєте перегони. І як завадити майбутньому технічному обслуговувальнику помилитися? Якщо ви подивитесь на великі / складні програми, ви побачите, що вони витрачають багато ресурсів у цьому напрямку.
Оскільки паралельність не є першокласною частиною більшості мов, сьогоднішні програмісти мають сліпе місце, чому це було б їм корисно. Це стане лише більш очевидним, оскільки кожен телефон і наручний годинник спрямовуються до 1000 ядер. Ідіть на кораблі із вбудованим інструментом детектора гонок.