Lassen Sie mich eine Antwort versuchen. Nehmen wir an, dass mein Einsatz zu Beginn nur einen einzigen Gunicorn-Arbeiter hat. Dadurch kann ich jeweils nur eine Anfrage bearbeiten. Die Arbeit meines Mitarbeiters besteht nur darin, google.com anzurufen und die Suchergebnisse für eine Abfrage abzurufen. Jetzt möchte ich meinen Durchsatz erhöhen. Ich habe die folgenden Optionen
Behalten Sie nur einen Worker und erhöhen Sie die Anzahl der Threads in diesem Worker
Das ist am einfachsten. Da Threads leichter sind (weniger Speicherverbrauch) als Prozesse, behalte ich nur einen Worker und füge dem mehrere Threads hinzu. Gunicorn stellt sicher, dass der Meister dann mehr als eine Anfrage an den Arbeiter senden kann. Da der Worker Multithreading ist, kann er 4 Anforderungen verarbeiten. Fantastisch. Warum sollte ich jemals mehr Arbeiter brauchen?
Um dies zu beantworten, nehmen wir an, dass ich einige Arbeiten an den von Google zurückgegebenen Suchergebnissen durchführen muss. Zum Beispiel möchte ich vielleicht auch eine Primzahl für jede Ergebnisabfrage berechnen. Jetzt mache ich meine Workload-Berechnung gebunden und stoße auf das Problem mit der globalen Interpretersperre von Python. Obwohl ich 4 Threads habe, kann jeweils nur ein Thread die Ergebnisse verarbeiten. Dies bedeutet, dass ich mehr als einen Mitarbeiter benötige, um eine echte parallele Leistung zu erzielen.
Erhöhen Sie die Anzahl der Arbeiter, aber alle Arbeiter haben einen einzigen Thread
Warum ich das brauche, ist, wenn ich echte Parallelverarbeitung brauche. Jeder Mitarbeiter kann parallel zu google.com anrufen, Ergebnisse abrufen und die Verarbeitung durchführen. Alles parallel. Fantastisch. Der Nachteil ist jedoch, dass die Prozesse schwerer sind und mein System möglicherweise nicht mit den Anforderungen steigender Mitarbeiter Schritt hält, um Parallelität zu erreichen. Die beste Lösung besteht also darin, die Anzahl der Mitarbeiter zu erhöhen und jedem Mitarbeiter mehr Threads hinzuzufügen.
Erhöhen Sie die Anzahl der Mitarbeiter, und jeder Mitarbeiter verfügt über mehrere Threads
Ich denke, das bedarf keiner weiteren Erklärung.
Ändern Sie den Arbeitertyp in Async
Warum sollte ich das jemals tun wollen? Denken Sie zur Beantwortung daran, dass selbst Threads Speicher belegen. Es gibt Coroutinen (ein radikales Konstrukt, das Sie nachschlagen können), die von der Gevent-Bibliothek implementiert wurden und die es Ihnen ermöglichen, Threads abzurufen, ohne Threads erstellen zu müssen. Wenn Sie also Ihr Gunicorn so herstellen, dass es ein Arbeiter-Gevent verwendet, haben Sie den Vorteil, dass Sie KEINE Threads in Ihren Arbeitern erstellen müssen. Angenommen, Sie erhalten Threads, ohne diese explizit erstellen zu müssen.
Um Ihre Frage zu beantworten: Wenn Sie worker_type von etwas anderem als Sync verwenden, müssen Sie die Anzahl der Threads in Ihrer Gunicorn-Konfiguration nicht erhöhen. Sie können es auf jeden Fall tun, aber es macht den Zweck irgendwie zunichte.
Hoffe das hat geholfen.
Ich werde auch versuchen, die spezifischen Fragen zu beantworten.
Nein, die Thread-Option ist für die Async-Worker-Klasse nicht vorhanden. Dies muss tatsächlich durch die Dokumentation klarer gemacht werden. Ich frage mich, warum das nicht passiert ist.
Dies ist eine Frage, die mehr Wissen über Ihre spezifische Anwendung erfordert. Wenn die Verarbeitung dieser 100 parallelen Anforderungen nur E / A-Vorgänge umfasst, z. B. Abrufen aus der Datenbank, Speichern und Sammeln von Daten aus einer anderen Anwendung, können Sie den Threaded-Worker verwenden. Wenn dies jedoch nicht der Fall ist und Sie auf einer Kern-CPU ausführen möchten, weil die Aufgaben extrem rechengebunden sind, z. B. beim Berechnen von Primzahlen, müssen Sie den Sync-Worker verwenden. Die Argumentation für Async ist etwas anders. Um Async verwenden zu können, müssen Sie sicherstellen, dass Ihre Verarbeitung nicht an Berechnungen gebunden ist. Dies bedeutet, dass Sie nicht mehrere Kerne verwenden können. Der Vorteil, den Sie erhalten, ist, dass der Speicher, den mehrere Threads benötigen würden, nicht vorhanden wäre. Sie haben jedoch andere Probleme, z. B. Bibliotheken, die nicht mit Affen gepatcht sind.
Synchronisierte Worker ohne Thread sind die beste Option, wenn Sie absolute Thread-Sicherheit in Ihren Bibliotheken wünschen.