Meine Frage: Welche Art von Anwendung erfordert so viele gleichzeitige Ausführungsthreads?
1) Die Tatsache, dass eine Sprache "skaliert", bedeutet, dass die Wahrscheinlichkeit geringer ist, dass Sie diese Sprache fallen lassen müssen, wenn die Dinge später komplexer werden. (Dies wird als "Gesamtprodukt" -Konzept bezeichnet.) Viele Leute werfen Apache aus genau diesem Grund für Nginx in den Sand. Wenn Sie sich der "harten Grenze" nähern, die der Thread-Overhead auferlegt, werden Sie ängstlich und überlegen, wie Sie daran vorbeikommen können. Websites können niemals vorhersagen, wie viel Datenverkehr sie erhalten werden. Daher ist es sinnvoll, ein wenig Zeit darauf zu verwenden, die Dinge skalierbar zu machen.
2) Eine Goroutine pro Anfrage nur zu Beginn. Es gibt viele Gründe, Goroutinen intern zu verwenden.
- Stellen Sie sich eine Web-App mit 100 gleichzeitigen Anforderungen vor, aber jede Anforderung generiert 100 Back-End-Anforderungen. Das offensichtliche Beispiel ist ein Suchmaschinenaggregator. Aber so ziemlich jede App könnte Goroutinen für jeden "Bereich" auf dem Bildschirm erstellen und sie dann unabhängig und nicht nacheinander generieren. Zum Beispiel besteht jede Seite auf Amazon.com aus mehr als 150 Back-End-Anfragen, die nur für Sie zusammengestellt wurden. Sie bemerken es nicht, weil sie parallel und nicht sequentiell sind und jeder "Bereich" ein eigener Webdienst ist.
- Betrachten Sie eine App, bei der Zuverlässigkeit und Latenz von größter Bedeutung sind. Sie möchten wahrscheinlich, dass jede eingehende Anforderung einige Back-End-Anforderungen auslöst und die zuerst zurückgegebenen Daten zurückgibt .
- Betrachten Sie jeden "Client-Beitritt" in Ihrer App. Anstatt "für jedes Element Daten abrufen" zu sagen, können Sie eine Reihe von Goroutinen abspalten. Wenn Sie eine Reihe von Slave-DBs abfragen müssen, werden Sie auf magische Weise N Mal schneller. Wenn Sie dies nicht tun, wird es nicht langsamer.
Wenn die Anzahl der Threads / Prozesse viel größer als die Anzahl der physischen Kerne ist, führt dies zu einem Rückgang der Treffer
Die Leistung ist nicht der einzige Grund, ein Programm in CSP aufzulösen . Es kann das Programm tatsächlich verständlicher machen und einige Probleme können mit viel weniger Code gelöst werden.
Wie in den oben verlinkten Folien ist die gleichzeitige Verwendung von Code eine Möglichkeit, das Problem zu organisieren. Das Fehlen von Goroutinen entspricht dem Fehlen einer Karten-, Diktier- oder Hash-Datenstruktur in Ihrer Sprache. Sie können ohne auskommen. Aber sobald Sie es haben, können Sie es überall verwenden, und es vereinfacht Ihr Programm wirklich.
In der Vergangenheit bedeutete dies "Roll your own" Multithread-Programmierung. Aber das war komplex und gefährlich - es gibt immer noch nicht viele Tools, mit denen Sie sicherstellen können, dass Sie keine Rennen veranstalten. Und wie verhindern Sie, dass ein zukünftiger Betreuer einen Fehler macht? Wenn Sie sich große / komplexe Programme ansehen, werden Sie feststellen, dass sie eine Menge Ressourcen in diese Richtung verbrauchen .
Da Parallelität in den meisten Sprachen kein erstklassiger Bestandteil ist, haben die heutigen Programmierer einen blinden Fleck, warum sie für sie nützlich sein sollten. Dies wird erst deutlicher, wenn jedes Telefon und jede Armbanduhr auf 1000 Kerne zusteuert. Gehen Sie mit einem eingebauten Race-Detector-Tool auf Schiff.