ホームページ 運用・保守 安全性 Gunicorn Arbiter のソースコードを分析する方法

Gunicorn Arbiter のソースコードを分析する方法

May 12, 2023 pm 04:28 PM
gunicorn arbiter

前述したように、Arbiter はガニコーン マスター プロセスの中核です。 Arbiter は主に、ワーカー プロセスの起動、監視、強制終了などのワーカー プロセスの管理を担当しますが、同時に、特定の信号が発生したときにアプリ アプリケーションのホット アップデート (リロード) やオンラインでの gunicorn のアップグレードも行うことができます。 Arbiter のコア コードは 1 つのファイルに含まれており、コード量はそれほど多くありません。ソース コードはここにあります: https://github.com/benoitc/gunicorn。

Arbiter には主に次のメソッドがあります:

setup:

設定項目の処理。最も重要なものはワーカーの数と作業中のワーカーです。 model

init_signal

信号処理関数の登録

handle_xxx:

それぞれの固有の処理関数signal

kill_worker、kill_workers:

ワーカー プロセスにシグナルを送信します

spawn_worker、spawn_workers:

フォークして新しいワーカー プロセスを作成します

murder_workers:

一定期間応答しないワーカー プロセスを強制終了します

manage_workers:

構成ファイル内のワーカーの数と現在アクティブなワーカーの数に基づいて、ワーカー プロセスをフォークするか強制終了するかを決定します

reexec:

シグナル SIGUSR2 呼び出しを受信した後、gunicorn をオンラインでアップグレードします

#reload:

シグナル SIGHUP 呼び出しを受信した後、ワーカー プロセスは新しい構成に基づいて開始され、以前のワーカー プロセスは強制終了されます

sleep:

信号処理がない場合は、選択タイムアウトを使用してスリープし、ウェイクアップ

#wakeup:

パイプにメッセージを書き込んでプロセスをウェイクアップ

run:

メイン ループ

他のコード (アプリケーション) __init__ によって実際に呼び出されるアービターの唯一の関数とメソッドを 1 行のコードで記述します:

Arbiter(self) .run()

上記のコードの self は Application インスタンスであり、_ _init__ は setup を呼び出して構成項目を設定します。以下は run メソッドの疑似コードです。


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()
ログイン後にコピー


## fork 子プロセスについて

fork 子プロセス コードは spawn_worker にあり、ソースコードは次のとおりです。

Arbiter.spawn_worker如何进行gunicorn Arbiter 源码解析

メインプロセス:

(1) worker_class をロードしてインスタンス化します。 (デフォルトは同期モデル SyncWorker)

(2) 親プロセス (マスタープロセス) は fork 後に戻り、後続のロジックはすべて子プロセスで実行されます

(3) worker.init_process を呼び出しますループに入り、すべての新しいチャネル IELTS トレーニング作業はすべてこのループ内にあります

(4) ループが終了したら、sys.exit(0)

(5) 最後に、最後に、ワーカー プロセスの終了を記録します

以下は私が自分で書いたコードの一部で、メインのフォーク プロセスを簡素化します

#

 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()
ログイン後にコピー


テスト環境での出力:

fork sub process 9601

fork sub process 9602

sub process will exit 9601 9600

サブプロセスは終了します 9602 9600

メインプロセスは終了します 9600

20 行目で

sys.exit

を呼び出して、子プロセスが確実に終了するようにし、それ以外の場合はメイン関数の for ループが続行され、その後のロジックが続行されます。 19行目をコメントアウトして再度実行すると、出力を見れば分かります。

子プロセスの強制終了について

マスター プロセスがワーカー プロセスを強制終了するのは非常に簡単です。シグナルを直接送信します。ソース コードは次のとおりです:

 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
ログイン後にコピー


睡眠と覚醒について

Arbiter の睡眠と覚醒について見てみましょう。 Arbiter は、処理する信号がないときに「スリープ」します。もちろん、実際には time.sleep を呼び出しません。そうしないと、信号が届いてもすぐに処理されません。ここでの実装は、パイプと選択タイムアウトを使用して、より賢明です。コードを見るだけで、

        def sleep(self):        """\
        Sleep until PIPE is readable or we timeout.
        A readable PIPE means a signal occurred.        """
            ready = select.select([self.PIPE[0]], [], [], 1.0) # self.PIPE = os.pipe()
            if not ready[0]: 
                return
            while os.read(self.PIPE[0], 1):                pass
ログイン後にコピー

コード内のコメントが非常に明確です。PIPE が読みやすく、すぐに返されるか、待ち時間がタイムアウトします。シグナルが発生したため、パイプは読み取り可能です。ここではパイプ関数を見ていきます

    ## os.
  • pipe()

    パイプを作成するそれぞれ読み取りと書き込みに使用できるファイル記述子のペア
  • (r,w)
  • を返します。

    次に、パイプが読み取り可能になる場合を見てみましょう。パイプに何を書き込むか、これがウェイクアップ関数の機能です
        def wakeup(self):            """
            Wake up the arbiter by writing to the PIPE            """
            os.write(self.PIPE[1], b'.')
ログイン後にコピー

最後にアービターの信号処理が取り付けられます

:

Exit, INT: 迅速なシャットダウン

TERM: 正常なシャットダウン。タイムアウトになるまで、ワーカーが現在のリクエストを完了するのを待ちます。

HUP: 構成をリロードし、新しい構成で新しいワーカー プロセスを開始し、古いワーカー プロセスを正常にシャットダウンします。アプリケーションがプリロードされていない場合 (--preload オプションを使用)、Gunicorn は新しいバージョンもロードします。

TTIN: プロセス数を 1 つ増やします

TTOU: プロセス数を 1 つ減らします

USR1: ログ ファイルを再度開きます

USR2: Gunicon をその場でアップグレードします。古いプロセスを終了するには、別の用語シグナルを使用する必要があります。この信号は、プリロードされた新しいバージョンのアプリケーションを使用するためにも使用できます。

Winch: Gunicorn がデーモン化されたときにワーカー プロセスを正常にシャットダウンします。

以上がGunicorn Arbiter のソースコードを分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Gunicorn と Python GIL を 1 つの記事で理解する Gunicorn と Python GIL を 1 つの記事で理解する Apr 12, 2023 am 10:40 AM

Python GIL とは何ですか、それはどのように機能し、gunicorn にどのような影響を与えますか。本番環境ではどの Gunicorn ワーカー タイプを選択すればよいですか? Python には、1 つのスレッドのみの実行 (つまり、バイトコードの解釈) を許可するグローバル ロック (GIL) があります。私の意見では、Python サービスを最適化したい場合は、Python が同時実行性をどのように処理するかを理解することが不可欠です。 Python と gunicorn では同時実行性を処理するさまざまな方法が提供されますが、すべてのユースケースをカバーする特効薬はないため、オプション、トレードオフ、および各オプションの利点を理解することをお勧めします。ガニコーンワーカータイプグニコ

Flask アプリケーション展開における Gunicorn と uWSGI のパフォーマンスの比較 Flask アプリケーション展開における Gunicorn と uWSGI のパフォーマンスの比較 Jan 17, 2024 am 08:52 AM

Flask アプリケーションのデプロイメント: Gunicorn と suWSGI の比較 はじめに: Flask は、軽量の Python Web フレームワークとして、多くの開発者に愛されています。 Flask アプリケーションを運用環境にデプロイする場合、適切なサーバー ゲートウェイ インターフェイス (SGI) を選択することが重要な決定となります。 Gunicorn と uWSGI は 2 つの一般的な SGI サーバーであり、この記事ではこれらについて詳しく説明します。

Gunicorn の基本と機能について詳しく知る Gunicorn の基本と機能について詳しく知る Jan 03, 2024 am 08:41 AM

Gunicorn の基本概念と機能 Gunicorn は、Python Web アプリケーションで WSGI サーバーを実行するためのツールです。 WSGI (Web Server Gateway Interface) は Python 言語で定義された仕様で、Web サーバーと Web アプリケーション間の通信インターフェイスを定義するために使用されます。 Gunicorn では、WSGI 仕様を実装することで、Python Web アプリケーションを運用環境にデプロイして実行できるようになります。ガニコーンの機能は次のとおりです。

ガニコーンとは ガニコーンとは Nov 23, 2023 pm 03:07 PM

Gunicorn は、Python で書かれた WSGI (HTTP サーバー) Web サーバー ゲートウェイ インターフェイス仕様で、Python Web アプリケーションを実行するために特別に設計された軽量で効率的なサーバーです。その主な特徴と機能は次のとおりです: 1. 高い同時リクエストを簡単に処理できる高いパフォーマンス; 2. 安定性と信頼性があり、耐久性のある長期運用を提供し、サーバークラッシュの可能性を大幅に低減します; 3. フォールトトレランス。サービスの安定性を維持するため; 4. 複数の導入方法など

Flask アプリケーションのための Gunicorn 導入ガイド Flask アプリケーションのための Gunicorn 導入ガイド Jan 17, 2024 am 08:13 AM

Gunicorn を使用して Flask アプリケーションをデプロイするにはどうすればよいですか? Flask は、さまざまなタイプの Web アプリケーションの開発に広く使用されている軽量の Python Web フレームワークです。 Gunicorn (GreenUnicorn) は、WSGI (WebServerGatewayInterface) アプリケーションの実行に使用される Python ベースの HTTP サーバーです。この記事では、Gunicorn を使用して Flask アプリケーションをデプロイする方法を紹介します。

CentOS のインストール Gunicorn と CentOS のインストール パーティションのチュートリアル CentOS のインストール Gunicorn と CentOS のインストール パーティションのチュートリアル Feb 10, 2024 pm 09:20 PM

LINUX は、サーバーや開発環境で広く使用されている強力なオペレーティング システムです。CentOS は、Red Hat Enterprise Linux (RHEL) をベースにしたオープン ソース オペレーティング システムで、サーバー環境で広く使用されています。CentOS に Gunicorn をインストールしてパーティショニングすると、パフォーマンスが向上します。パフォーマンスとセキュリティについては、この記事では CentOS に Gunicorn をインストールする方法とパーティションを作成する方法について詳しく説明します。 CentOS に Gunicorn をインストールする Gunicorn は、Python Web アプリケーションを実行するための Python WSGIHTTP サーバーです。

Gunicorn と Flask の無敵の組み合わせを展開します Gunicorn と Flask の無敵の組み合わせを展開します Jan 17, 2024 am 10:24 AM

Gunicorn と Flask: 完璧なデプロイメントの組み合わせ、特定のコード例が必要 概要: 開発者にとって、特に Python Web アプリケーションの場合、適切なデプロイメント方法を選択することが非常に重要です。 Python Web フレームワークの中で、Flask は非常に人気のある選択肢であり、Gunicorn は Python アプリケーションをデプロイするためのサーバーです。この記事では、Gunicorn と Flask の組み合わせを紹介し、読者に役立ついくつかの具体的なコード例を提供します。

Flask アプリケーションのパフォーマンスを向上させる方法: Gunicorn を使用する Flask アプリケーションのパフォーマンスを向上させる方法: Gunicorn を使用する Jan 17, 2024 am 10:42 AM

Gunicorn はどのように Flask アプリケーションのパフォーマンスを向上させますか?インターネットの急速な発展に伴い、Web アプリケーションのパフォーマンスはユーザー エクスペリエンスと企業の競争力にとってますます重要になってきています。大量の同時リクエストを処理する場合、Flask フレームワークのデフォルトの開発サーバーでは需要を満たすことができないことがよくあります。したがって、Flask アプリケーションのパフォーマンスを向上させるには Gunicorn (GreenUnicorn) を使用する必要があります。 Gunicorn は、事前にフォークされた Python ベースの HTTP サーバーです。

See all articles