Heim Betrieb und Instandhaltung Sicherheit So analysieren Sie den Gunicorn Arbiter-Quellcode

So analysieren Sie den Gunicorn Arbiter-Quellcode

May 12, 2023 pm 04:28 PM
gunicorn arbiter

Wie bereits erwähnt, ist Arbiter der Kern des Gunicorn-Master-Prozesses. Arbiter ist hauptsächlich für die Verwaltung von Worker-Prozessen verantwortlich, einschließlich des Startens, Überwachens und Beendens von Worker-Prozessen. Gleichzeitig kann Arbiter auch App-Anwendungen im laufenden Betrieb aktualisieren (neu laden) oder Gunicorn online aktualisieren, wenn bestimmte Signale auftreten. Der Kerncode von Arbiter befindet sich in einer Datei und die Codemenge ist nicht groß. Der Quellcode ist hier: https://github.com/benoitc/gunicorn.

Arbiter verfügt hauptsächlich über die folgenden Methoden:

setup:

Das Wichtigste ist, Konfigurationselemente zu verarbeiten Anzahl der Arbeiter und Arbeiter-Arbeitsmodell handle_xxx#🎜🎜 #:

Spezifische Verarbeitungsfunktionen für jedes Signal

kill_worker, kill_workers

:

Signale senden zum Worker-Prozess# 🎜🎜#spawn_worker, spawn_workers

:

Einen neuen Worker-Prozess forken

murder_workers # ?? # Worker basierend auf der Konfigurationsdatei. Die Anzahl sowie die Anzahl der aktuell aktiven Worker bestimmen, ob der Worker-Prozess geforkt oder beendet wird #

Empfangenes Signal SIGUSR2-Aufruf, Online-Upgrade von Gunicorn

Neuladen:

Nach dem Empfang des Signals SIGHUP-Aufruf wird der Worker-Prozess ausgeführt Der Prozess wird basierend auf der neuen Konfiguration gestartet und der vorherige Worker wird beendet die ausgewählte Zeitüberschreitung zum Schlafen und kann geweckt werden

run

Hauptschleife

Die einzigen Funktionen von Arbiter, die tatsächlich von anderen Codes (Anwendung) aufgerufen werden, sind __init__ und Laufmethoden. In einer Codezeile:

Arbiter(self).run()

Das Selbst im obigen Code ist das Anwendungsinstanz, in der __init__ Setup aufruft, um die Konfigurationselemente festzulegen. Das Folgende ist der Pseudocode der Ausführungsmethode

def run()
    self.init_signal()
    self.LISTENERS = create_sockets(self.cfg, self.log)
    self.manage_workers()    while True:        if no signal in SIG_QUEUE
            self.sleep()        else:
            handle_signal()
Nach dem Login kopieren

Über Fork Child Prozess#🎜🎜 #

Der Code für den untergeordneten Fork-Prozess befindet sich in spawn_worker. Der Quellcode lautet wie folgt:

Arbiter.spawn_worker Hauptprozess:

(1) worker_class laden und instanziieren (Standard ist das synchrone Modell SyncWorker)

(2) Der übergeordnete Prozess (Masterprozess) kehrt nach der Verzweigung zurück , und die gesamte nachfolgende Logik wird im untergeordneten Prozess ausgeführt # (4) Nachdem die Schleife beendet ist, rufen Sie sys.exit(0) auf # Das Folgende ist ein Teil des Codes, den ich selbst geschrieben habe. Der Haupt-Fork-Prozess ist vereinfacht 🎜#Ausgabe in der Testumgebung:

# 🎜🎜# Fork-Unterprozess 9601

Fork-Unterprozess 9602

Unterprozess wird beendet 9601 9600

Unterprozess wird beendet 9602 9600#🎜🎜 #

 Hauptprozess wird beendet 9600

Es ist zu beachten, dass Zeile 20

sys.exit aufruft
um das Ende des untergeordneten Prozesses sicherzustellen, andernfalls wird die Hauptfunktion fortgesetzt. Die for-Schleife und die nachfolgende Logik. Kommentieren Sie Zeile 19 aus und führen Sie sie erneut aus. Anhand der Ausgabe werden Sie es verstehen.

Über das Beenden des Unterprozesses

Es ist sehr einfach, den Arbeitsprozess zu beenden. Er sendet ein Signal direkt Der Quellcode lautet wie folgt:


 1 # prefork.py 2 import sys 3 import socket 4 import select 5 import os 6 import time 7   8 def do_sub_process(): 9     pid = os.fork()10     if pid < 0:11         print &#39;fork error&#39;12         sys.exit(-1)13     elif pid > 0:14         print 'fork sub process %d'  % pid15         return16  17     # must be child process18     time.sleep(1)19     print 'sub process will exit', os.getpid(), os.getppid()20     sys.exit(0)21  22 def main():23     sub_num = 224     for i in range(sub_num):25         do_sub_process()26     time.sleep(10)27     print 'main process will exit', os.getpid()28  29 if __name__ == '__main__':30     main()
Nach dem Login kopieren

Über Schlaf und Aufwachen#🎜🎜 #

us Werfen wir einen Blick auf Arbiters Schlaf und Aufwachen. Der Arbiter wird „schlafen“, wenn kein Signal zur Verarbeitung vorhanden ist. Natürlich ruft er time.sleep nicht auf, da das Signal sonst nicht sofort verarbeitet wird, wenn es eintrifft. Die Implementierung ist hier cleverer und verwendet Pipes und Select Timeout. Schauen Sie sich einfach den Code an und Sie werden es wissen

如何进行gunicorn Arbiter 源码解析

 1     def kill_worker(self, pid, sig): 2         """\ 3         Kill a worker 4  5         :attr pid: int, worker pid 6         :attr sig: `signal.SIG*` value 7          """ 8         try: 9             os.kill(pid, sig)10         except OSError as e:11             if e.errno == errno.ESRCH:12                 try:13                     worker = self.WORKERS.pop(pid)14                     worker.tmp.close()15                     self.cfg.worker_exit(self, worker)16                     return17                 except (KeyError, OSError):18                     return19             raise
Nach dem Login kopieren

Die Kommentare im Code sind sehr klar geschrieben, oder PIPE kann sofort gelesen und zurückgegeben werden, oder auf eine Zeitüberschreitung warten. Die Pipe ist lesbar, da ein Signal auftritt. Hier ist ein Blick auf die Pipe-Funktion

 os.pipe()

#🎜 🎜#

Erstellen Sie ein Paar Dateideskriptoren (r,w), die jeweils zum Lesen und Schreiben verwendet werden können.

#🎜 🎜# Schauen wir uns an, wann die Pipe lesbar ist: Es muss etwas in die Pipe geschrieben werden #:

Exit, INT: Schnelles Herunterfahren#. 🎜🎜#

LAUFZEIT: Ordentliches Herunterfahren. Wartet darauf, dass der Worker seine aktuelle Anforderung abschließt, bis eine Zeitüberschreitung auftritt.

HUP: Konfiguration neu laden, neue Arbeitsprozesse mit neuer Konfiguration starten und alte Arbeitsprozesse ordnungsgemäß herunterfahren. Gunicorn lädt die neue Version auch, wenn die Anwendung nicht vorinstalliert ist (mit der Option --preload).

TTIN: Erhöhen Sie die Anzahl der Prozesse um eins.

TTOU: Verringern Sie die Anzahl der Prozesse um eins.

USR1: Öffnen Sie die Protokolldatei erneut.

USR2: Aktualisieren Sie Gunicorn im Handumdrehen. Um den alten Prozess zu beenden, sollte ein separates Laufzeitsignal verwendet werden. Dieses Signal kann auch verwendet werden, um vorinstallierte neue Versionen der Anwendung zu verwenden.

Winch: Arbeitsprozesse ordnungsgemäß herunterfahren, wenn Gunicorn dämonisiert wird.

Das obige ist der detaillierte Inhalt vonSo analysieren Sie den Gunicorn Arbiter-Quellcode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Gunicorn und Python GIL in einem Artikel verstehen Gunicorn und Python GIL in einem Artikel verstehen Apr 12, 2023 am 10:40 AM

Was ist die Python-GIL, wie funktioniert sie und wie wirkt sie sich auf Gunicorn aus? Welchen Gunicorn-Arbeitertyp sollte ich für die Produktion wählen? Python verfügt über eine globale Sperre (GIL), die nur die Ausführung eines Threads (d. h. die Interpretation des Bytecodes) ermöglicht. Meiner Meinung nach ist es wichtig zu verstehen, wie Python mit Parallelität umgeht, wenn Sie Ihre Python-Dienste optimieren möchten. Python und Gunicorn bieten Ihnen unterschiedliche Möglichkeiten, mit Parallelität umzugehen, und da es kein Allheilmittel gibt, das alle Anwendungsfälle abdeckt, ist es eine gute Idee, die Optionen, Kompromisse und Vorteile jeder Option zu verstehen. Gunicorn-ArbeitertypGunico

Vergleich der Leistung von Gunicorn und uWSGI für die Bereitstellung von Flask-Anwendungen Vergleich der Leistung von Gunicorn und uWSGI für die Bereitstellung von Flask-Anwendungen Jan 17, 2024 am 08:52 AM

Flask-Anwendungsbereitstellung: Vergleich von Gunicorn und suWSGI Einführung: Flask ist als leichtes Python-Web-Framework bei vielen Entwicklern beliebt. Bei der Bereitstellung einer Flask-Anwendung in einer Produktionsumgebung ist die Auswahl der geeigneten Server Gateway Interface (SGI) eine entscheidende Entscheidung. Gunicorn und uWSGI sind zwei gängige SGI-Server. In diesem Artikel werden sie ausführlich beschrieben.

Erfahren Sie mehr über die Grundlagen und Funktionen von Gunicorn Erfahren Sie mehr über die Grundlagen und Funktionen von Gunicorn Jan 03, 2024 am 08:41 AM

Grundlegende Konzepte und Funktionen von Gunicorn Gunicorn ist ein Tool zum Ausführen von WSGI-Servern in Python-Webanwendungen. WSGI (Web Server Gateway Interface) ist eine von der Python-Sprache definierte Spezifikation und wird zur Definition der Kommunikationsschnittstelle zwischen Webservern und Webanwendungen verwendet. Gunicorn ermöglicht die Bereitstellung und Ausführung von Python-Webanwendungen in Produktionsumgebungen durch Implementierung der WSGI-Spezifikation. Die Funktion von Gunicorn ist es

Gunicorn-Bereitstellungshandbuch für Flask-Anwendungen Gunicorn-Bereitstellungshandbuch für Flask-Anwendungen Jan 17, 2024 am 08:13 AM

Wie stellt man die Flask-Anwendung mit Gunicorn bereit? Flask ist ein leichtes Python-Web-Framework, das häufig zur Entwicklung verschiedener Arten von Webanwendungen verwendet wird. Gunicorn (GreenUnicorn) ist ein Python-basierter HTTP-Server, der zum Ausführen von WSGI-Anwendungen (WebServerGatewayInterface) verwendet wird. In diesem Artikel wird erläutert, wie Sie mit Gunicorn Flask-Anwendungen bereitstellen

Was ist Gunicorn? Was ist Gunicorn? Nov 23, 2023 pm 03:07 PM

Gunicorn ist eine in Python geschriebene WSGI-Webserver-Gateway-Schnittstellenspezifikation. Es handelt sich um einen leichten und effizienten Server, der speziell für die Ausführung von Python-Webanwendungen entwickelt wurde. Zu seinen Hauptmerkmalen und Funktionen gehören: 1. Hohe Leistung, die problemlos viele gleichzeitige Anforderungen verarbeiten kann; 2. Stabilität und Zuverlässigkeit, die einen dauerhaften Langzeitbetrieb ermöglichen und die Möglichkeit eines Serverabsturzes erheblich reduzieren; tun Um die Stabilität des Dienstes aufrechtzuerhalten; 4. Mehrere Bereitstellungsmethoden usw.

Setzen Sie die unschlagbare Kombination aus Gunicorn und Flask ein Setzen Sie die unschlagbare Kombination aus Gunicorn und Flask ein Jan 17, 2024 am 10:24 AM

Gunicorn und Flask: Die perfekte Bereitstellungskombination, die spezifische Codebeispiele erfordert. Übersicht: Für Entwickler ist es sehr wichtig, die geeignete Bereitstellungsmethode zu wählen, insbesondere für Python-Webanwendungen. Unter den Python-Webframeworks ist Flask eine sehr beliebte Wahl und Gunicorn ist ein Server für die Bereitstellung von Python-Anwendungen. In diesem Artikel wird die Kombination von Gunicorn und Flask vorgestellt und einige spezifische Codebeispiele bereitgestellt, um den Lesern zu helfen

Tutorial zur CentOS-Installation von Gunicorn und der CentOS-Installationspartition Tutorial zur CentOS-Installation von Gunicorn und der CentOS-Installationspartition Feb 10, 2024 pm 09:20 PM

LINUX ist ein leistungsstarkes Betriebssystem, das häufig in Servern und Entwicklungsumgebungen verwendet wird. CentOS ist ein Open-Source-Betriebssystem, das auf Red Hat Enterprise Linux (RHEL) basiert und häufig in Serverumgebungen verwendet wird. Die Installation von Gunicorn und die Partitionierung unter CentOS können die Leistung verbessern Um die Leistung und Sicherheit des Servers zu verbessern, erfahren Sie in diesem Artikel, wie Sie Gunicorn unter CentOS installieren und partitionieren. Gunicorn unter CentOS installieren Gunicorn ist ein Python-WSGIHTTP-Server zum Ausführen von Python-Webanwendungen. Im Folgenden erfahren Sie, wie Sie Gunicorn unter CentOS installieren.

So verbessern Sie die Leistung der Flask-Anwendung: Verwenden Sie Gunicorn So verbessern Sie die Leistung der Flask-Anwendung: Verwenden Sie Gunicorn Jan 17, 2024 am 10:42 AM

Wie verbessert Gunicorn die Leistung von Flask-Anwendungen? Mit der rasanten Entwicklung des Internets wird die Leistung von Webanwendungen immer wichtiger für das Benutzererlebnis und die Wettbewerbsfähigkeit von Unternehmen. Bei der Verarbeitung hoher gleichzeitiger Anforderungen kann der Standardentwicklungsserver des Flask-Frameworks die Anforderungen häufig nicht erfüllen. Daher müssen wir Gunicorn (GreenUnicorn) verwenden, um die Leistung von Flask-Anwendungen zu verbessern. Gunicorn ist ein Python-basierter HTTP-Server, der Pre-Forked verwendet

See all articles