My question: what sort of application requires so many concurrent threads of execution?
1) Il fatto che una lingua "scala" significa che ci sono meno possibilità che tu debba abbandonare quella lingua quando le cose diventano più complesse lungo la strada. (Questo è chiamato il concetto di "Whole Product".) Molte persone stanno abbandonando Apache per Nginx proprio per questo motivo. Se sei vicino al "limite rigido" imposto dall'overhead del thread, ti spaventerai e inizierai a pensare ai modi per superarlo. I siti Web non possono mai prevedere la quantità di traffico che riceveranno, quindi spendere un po 'di tempo per rendere le cose scalabili è ragionevole.
2) Una goroutine per richiesta solo all'inizio. Ci sono molte ragioni per usare internamente le goroutine.
- Considera un'app Web con 100 richieste simultanee, ma ogni richiesta genera centinaia di richieste di back-end. L'esempio ovvio è un aggregatore di motori di ricerca. Ma qualsiasi app potrebbe creare goroutine per ogni "area" sullo schermo, quindi generarle in modo indipendente anziché sequenziale. Ad esempio, ogni pagina su Amazon.com è composta da oltre 150 richieste di back-end, assemblate solo per te. Non ti accorgi perché sono in parallelo, non sequenziali, e ogni "area" è il proprio servizio web.
- Considerare qualsiasi app in cui affidabilità e latenza sono fondamentali. Probabilmente vorrai che ogni richiesta in arrivo spari alcune richieste di back-end e restituisca per prima cosa i dati tornano prima .
- Considera qualsiasi "aggiunta di clienti" nella tua app. Invece di dire "per ogni elemento, ottieni dati", puoi far girare un mucchio di goroutine. Se hai una serie di DB slave da interrogare, diventerai magicamente N volte più veloce. Se non lo fai, non sarà più lento.
hit diminishing returns when the number of threads/processes is much greater than the number of physical cores
Le prestazioni non sono l'unica ragione per suddividere un programma in CSP . Può effettivamente rendere il programma più facile da capire, e alcuni problemi possono essere risolti con molto meno codice.
Come nelle diapositive collegate sopra, la concorrenza nel codice è un modo per organizzare il problema. Non avere goroutine è come non avere una struttura dati di Map / Dictonary / Hash nella tua lingua. Puoi farcela senza di essa. Ma una volta che lo hai, inizi a usarlo ovunque, e semplifica davvero il tuo programma.
In passato, questo significava "roll your own" programmazione multithread. Ma questo era complesso e pericoloso - non ci sono ancora molti strumenti per assicurarti di non creare gare. E come si impedisce a un futuro manutentore di commettere un errore? Se guardi programmi grandi / complessi, vedrai che spendono un sacco di risorse in quella direzione.
Poiché la concorrenza non è una parte di prima classe nella maggior parte delle lingue, i programmatori di oggi non sanno perché sarebbe utile per loro. Questo diventerà più evidente solo quando tutti i telefoni e gli orologi da polso puntano verso 1000 core. Naviga con uno strumento per rilevatori di corsa integrato.