Ich versuche sie mit anderen Worten zu sagen.
Auf einem Server können viele asp.net-Sites zusammen ausgeführt werden. Jede Site ist eine App-Domain .
Sie müssen jedem von ihnen einen Anwendungspool zuweisen . Viele Anwendungsdomänen (Sites) können denselben Anwendungspool haben, und da sie denselben Anwendungspool haben, werden sie unter denselben Prozessen und unter demselben Konto ausgeführt - und sie haben dieselben Einstellungen des Pools. Wenn dieser Pool neu gestartet wird, werden alle Sites unter diesen Pools neu gestartet.
Jetzt kann jeder Pool einen oder mehrere Arbeitsprozesse haben . Jeder Arbeitsprozess ist ein anderes Programm, das Ihre Site ausführt, seine eigenen statischen Variablen hat, verschiedene Start-Stopp-Aufrufe usw. Verschiedene Arbeitsprozesse kommunizieren nicht miteinander, und der einzige Weg, Daten auszutauschen, besteht aus gemeinsamen Dateien oder einer gemeinsamen Datenbank. Wenn Sie mehr als einen Arbeitsprozess haben und einer von ihnen Langzeitberechnungen durchführt, kann der andere die Internetanrufe bearbeiten und Inhalte anzeigen.
Wenn Sie einem einzelnen Pool mehrere Worker-Prozesse zuweisen , erstellen Sie den aufgerufenen Webgarten, und Ihre Site wird gerne von mehr als einem Computer ausgeführt, wenn ein Computer eine Verarbeitungsmaschine ist.
Jeder Arbeitsprozess kann viele Threads haben.
Wie sich der Arbeitsprozess auf Sie auswirkt:
Wenn Sie einen Arbeitsprozess haben, ist alles einfacher. In Ihrer Anwendung sind alle statischen Variablen gleich, und Sie verwenden die lock
, um sie zu synchronisieren.
Wenn Sie mehr als einen Arbeitsprozess zuweisen , verwenden Sie weiterhin die lock
statischen Variablen. Statische Variablen unterscheiden sich nicht zwischen den vielen Läufen Ihrer Site, und wenn Sie über eine gemeinsame Ressource verfügen (z. B. das Erstellen einer Miniaturansicht auf der Festplatte). Dann müssen Sie Ihren Arbeitsprozess mit synchronisieren Mutex
.
Noch eine Anmerkung. Es hört sich so an, als ob Sie mehr asynchrone Seitenladevorgänge haben , wenn Sie mehr Arbeitsprozesse ausführen. Es gibt ein kleines Problem mit dem Sitzungshandler von asp.net, das den gesamten Prozess für das Laden einer Seite sperrt - das ist gut und nicht gut, hängt davon ab, ob Sie es kennen und damit umgehen - oder es zu ändern.
Lassen Sie uns also nur über eine Site mit vielen Arbeitsprozessen sprechen. Hier sehen Sie sich dem Problem gegenüber, mit dem Sie Ihre allgemeine Ressourcenänderung synchronisieren müssen Mutex
. Die Seiten / Handler, die die Sitzung verwenden, sind jedoch nicht asynchron, da die Sitzung sie sperrt. Dies ist ein guter Anfang, da Sie vermeiden, diese Synchronisation vieler Punkte selbst vorzunehmen.
Einige Fragen zu diesem Thema:
Webanwendung blockiert während der Verarbeitung einer anderen Webanwendung beim Freigeben derselben Sitzung
jQuery Ajax-Aufrufe an den Webdienst scheinen synchron zu sein
ASP.NET Server verarbeitet Seiten nicht asynchron
Ersetzt die Sitzung von ASP.Net vollständig
Jetzt wirkt sich diese Sitzungssperre nicht auf verschiedene Sites aus.
Unter verschiedenen Standorten kann der besser funktionierende Prozess dazu beitragen, dass nicht der eine Standort den anderen mit einem lang laufenden Prozess blockiert.
Auch zwischen verschiedenen Standorten können mehr Pools hilfreich sein, da jeder Pool mindestens einen funktionierenden Prozess hat. Denken Sie jedoch daran, dass jeder Arbeitsprozess mehr Arbeitsspeicher Ihres Computers und einen großen Server mit 16G-Speicher benötigt und ein SQL Server kann nicht zu viele verschiedene Arbeitsprozesse haben - auf einem Server mit 100 gemeinsam genutzten Sites können Sie beispielsweise nicht 100 verschiedene Pools haben.