Django Multithreading auf Apache/mod_wsgi/Windows

Django Multithreading auf Apache/mod_wsgi/Windows

Ich bin ziemlich neu in der Kombination von Apache und Django und ehrlich gesagt ziemlich naiv, was den Umgang mit Multithreading angeht. Ich verwende nämlich einen Windows-Server, daher weiß ich, dass MPM nur Thread-basiert ist.

Ich habe eine Anwendung, die die Seiten einer Website bereitstellt, und eine andere Anwendung, die einen CPU-intensiven Hintergrundprozess ausführt, der von Zeit zu Zeit stattfindet und bis zu 30 Sekunden oder so dauert. Ich mache mir Sorgen, dass ich auf Leistungsprobleme stoßen könnte, und habe mehrere Fragen. Ich hoffe, diese helfen auch anderen ...

  1. Wie verteilt Apache gleichzeitige Anfragen zwischen Threads? Und zwischen CPUs? Welche Logik steckt dahinter? Erzeugt jede Anfrage einen eigenen Thread?
  2. Kann ich manuell festlegen, dass eine bestimmte App auf einer separaten CPU ausgeführt wird? Wenn ich beispielsweise eine Maschine mit 4 CPUs habe, kann ich dann 1 CPU für Website-Anfragen und 3 andere für die Ausführung des Hintergrundprozesses bei Bedarf festlegen?
  3. Wie lesen/schreiben mehrere Threads in dieselbe Datenbank? Ich gehe nicht davon aus, dass es zu Kollisionen kommt, da das Schreiben pro Benutzer erfolgt, aber ich weiß nicht, wie dies tatsächlich gehandhabt wird.
  4. Was passiert, wenn ich mehr als eine solche Maschine habe, z. B. wenn ich sie auf EC2 laufen lasse und mehr als eine Instanz habe? Wie werden die Anfragen verteilt?

Danke

Antwort1

Allgemeine Informationen finden Sie unter:

Wie verteilt Apache gleichzeitige Anfragen zwischen Threads?

Für eine Multithread-Konfiguration gibt es einen Pool vorab erstellter Threads. Wenn eine neue Anfrage eingeht, wird diese zur Verarbeitung an einen der verfügbaren Threads im Pool übergeben. Wenn dies erledigt ist, geht der Thread zurück in den Pool.

Wie verteilt Apache gleichzeitige Anfragen zwischen CPUs?

Nein, wo ein Thread zu einem bestimmten Zeitpunkt ausgeführt wird, wird vom Betriebssystem bestimmt. Threads sind von Apache nicht an einen bestimmten Prozessor gebunden, die Ausführung kann also verschoben werden.

Erzeugt jede Anfrage einen separaten Thread?

Für von Apache verarbeitete Webanforderungen lautet die Antwort „Nein“.

Kann ich manuell angeben, dass eine bestimmte App auf einer separaten CPU ausgeführt werden soll?

Es gibt Möglichkeiten, die Prozessoraffinität so einzustellen, dass Prozesse an Prozessoren gebunden werden, aber wie Sie das tun, hängt vom System ab. Apache selbst bietet meines Wissens keinen Konfigurationsmechanismus, um dies für sich selbst zu tun.

Wie lesen/schreiben mehrere Threads in dieselbe Datenbank?

Vorsicht. Normalerweise kümmert sich der Datenbankserverprozess um all das, sodass Sie sich keine Sorgen machen müssen. In einem Client müssen Sie jedoch sicherstellen, dass jeder Thread seine eigene Datenbankverbindung verwendet, indem Sie für jede Anforderung eine erstellen, oder Sie haben einen Pool von Datenbankverbindungen und Threads greifen bei Bedarf auf eine Verbindung aus dem Pool zu und geben sie zurück, wenn sie fertig sind.

Beachten Sie, dass dies eine Datenbank voraussetzt, bei der der Zugriff über einen Serverprozess vermittelt wird. Wenn Sie eine dateisystembasierte Datenbank verwenden, sollte die Datenbank-Clientbibliothek sicherstellen, dass der Multithread-Zugriff sicher ist.

Was passiert, wenn ich mehr als eine solche Maschine habe, z. B. wenn ich sie auf EC2 laufen lasse und mehr als eine Instanz habe? Wie werden die Anfragen verteilt?

Sie benötigen eine Art Frontend-Load Balancer, um Anfragen zu verteilen. Das kann ein richtiger Load Balancer sein, oder Sie können ein Nginx-Frontend als Proxy verwenden.

verwandte Informationen