Rumah Operasi dan penyelenggaraan Keselamatan Bagaimana untuk menganalisis kod sumber Arbiter gunicorn

Bagaimana untuk menganalisis kod sumber Arbiter gunicorn

May 12, 2023 pm 04:28 PM
gunicorn arbiter

Seperti yang dinyatakan sebelum ini, Arbiter adalah teras proses induk gunicorn. Arbiter bertanggungjawab terutamanya untuk mengurus proses pekerja, termasuk memulakan, memantau dan membunuh proses pekerja Pada masa yang sama, Arbiter juga boleh mengemas kini panas (muat semula) aplikasi aplikasi atau menaik taraf gunicorn dalam talian apabila isyarat tertentu berlaku. Kod teras Arbiter ada dalam satu fail, dan jumlah kod tidak besar Kod sumber ada di sini: https://github.com/benoitc/gunicorn.

Arbiter terutamanya mempunyai kaedah berikut:

persediaan:

Memproses item konfigurasi, yang paling penting ialah bilangan pekerja dan kerja pekerja model

init_signal

Daftar fungsi pemprosesan isyarat

handle_xxx:

Fungsi pemprosesan khusus bagi setiap isyarat

bunuh_pekerja, bunuh_pekerja:

Hantar isyarat kepada proses pekerja

spawn_workers, spawn_workers:

:

Berdasarkan bilangan pekerja dalam fail konfigurasi dan bilangan pekerja aktif pada masa ini, tentukan sama ada untuk menghentikan atau mematikan proses pekerja

reexec

:

Terima isyarat panggilan SIGUSR2, Naik Taraf gunicorn dalam talian

muat semula:

Selepas menerima panggilan SIGHUP isyarat, proses pekerja akan dimulakan berdasarkan konfigurasi baharu dan proses pekerja sebelumnya akan dimatikan

tidur

Apabila tiada pemprosesan isyarat, gunakan tamat masa pilih untuk tidur dan terjaga

bangun

Bangunkan proses dengan menulis mesej ke paip

lari

:

Gelung utama

Satu-satunya fungsi Arbiter yang sebenarnya dipanggil oleh kod lain (Application) __init__ dan kaedah jalankan, dalam satu baris kod:

Arbiter(self).run()

Diri dalam kod di atas ialah contoh Aplikasi, di mana_ _init__ memanggil persediaan untuk menetapkan item konfigurasi. Berikut ialah kod pseudo kaedah larian

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()
Salin selepas log masuk

Mengenai proses anak fork

proses anak fork Kod berada dalam spawn_worker, kod sumber adalah seperti berikut:


Arbiter.spawn_worker


Proses utama:

(1) Muatkan kelas_pekerja dan instantiate (lalai ialah model segerak SyncWorker) (2) Proses induk (proses induk) kembali selepas forking, dan semua logik seterusnya dijalankan dalam proses anak

(3) Panggil pekerja. init_process untuk memasuki gelung, semua saluran baharu latihan IELTS Semua kerja dalam gelung ini

(4) Selepas gelung tamat, panggil sys.exit(0)如何进行gunicorn Arbiter 源码解析

(5) Akhirnya, pada akhirnya, rekod keluar dari proses pekerja

Berikut adalah sedikit kod yang saya tulis sendiri, yang memudahkan proses garpu utama

 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()
Salin selepas log masuk

Output dalam persekitaran ujian:

subproses fork 9601

subproses fork 9602


subproses akan keluar 9601 9600

subproses akan keluar 9602 9600

 proses utama akan keluar 9600

Perlu diingat bahawa talian 20 memanggil sys.exit untuk memastikan tamatnya proses anak, jika tidak gelung for dalam fungsi utama akan diteruskan, dan logik seterusnya. Komen keluar baris 19 dan jalankan semula, dan anda akan faham dengan melihat output.

Mengenai membunuh proses kanak-kanak

Proses induk membunuh proses pekerja adalah sangat mudah Ia menghantar isyarat secara langsung 🎜>

 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
Salin selepas log masuk

Mengenai tidur dan bangun

Mari kita lihat tidur dan bangun Arbiter. Arbiter akan "tidur" apabila tiada isyarat untuk memproses Sudah tentu, ia sebenarnya tidak memanggil masa.tidur, jika tidak isyarat tidak akan diproses serta-merta apabila ia datang. Pelaksanaan di sini lebih bijak, menggunakan paip dan pilih tamat masa. Lihat sahaja kod dan anda akan tahu


        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
Salin selepas log masuk


Komen dalam kod adalah sangat jelas, sama ada PIPE boleh dibaca dan dikembalikan serta-merta, atau masa tunggu habis. Paip boleh dibaca kerana isyarat berlaku. Berikut ialah lihat fungsi paip

()


Buat paip kembalikan sepasang deskriptor fail

boleh digunakan untuk membaca dan menulis, masing -masing. fungsi

        def wakeup(self):            """
            Wake up the arbiter by writing to the PIPE            """
            os.write(self.PIPE[1], b'.')
Salin selepas log masuk

Akhir sekali pasangkan pemprosesan isyarat Arbiter
    :
  • Keluar, INT: Tutup pantas  os.pipeTERMA: Penutupan yang anggun. Menunggu pekerja menyelesaikan permintaan semasa sehingga tamat masa.

    HUP: Muat semula konfigurasi, mulakan proses pekerja baharu dengan konfigurasi baharu dan tutup proses pekerja lama dengan anggun. Gunicorn juga akan memuatkan versi baharu jika aplikasi tidak dipramuat (menggunakan pilihan --preload).

    TTIN: Tingkatkan bilangan proses sebanyak satu

    TTOU: Kurangkan bilangan proses sebanyak satu

    USR1: Buka semula fail log

    USR2: Naik taraf Gunicorn dengan pantas. Isyarat istilah yang berasingan harus digunakan untuk menamatkan proses lama. Isyarat ini juga boleh digunakan untuk menggunakan versi aplikasi baharu yang dipramuat.

    Winch: Matikan proses pekerja dengan anggun apabila Gunicorn didaemonkan.

Atas ialah kandungan terperinci Bagaimana untuk menganalisis kod sumber Arbiter gunicorn. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Fahami Gunicorn dan Python GIL dalam satu artikel Fahami Gunicorn dan Python GIL dalam satu artikel Apr 12, 2023 am 10:40 AM

Apakah Python GIL, bagaimana ia berfungsi, dan bagaimana ia mempengaruhi gunicorn. Jenis pekerja Gunicorn yang manakah harus saya pilih untuk pengeluaran? Python mempunyai kunci global (GIL) yang hanya membenarkan satu utas dijalankan (iaitu mentafsir bytecode). Pada pendapat saya, memahami cara Python mengendalikan concurrency adalah penting jika anda ingin mengoptimumkan perkhidmatan Python anda. Python dan gunicorn memberi anda cara yang berbeza untuk mengendalikan konkurensi, dan oleh kerana tiada peluru ajaib yang merangkumi semua kes penggunaan, adalah idea yang baik untuk memahami pilihan, pertukaran dan kelebihan setiap pilihan. Jenis pekerja GunicornGunico

Membandingkan prestasi Gunicorn dan uWSGI untuk penggunaan aplikasi Flask Membandingkan prestasi Gunicorn dan uWSGI untuk penggunaan aplikasi Flask Jan 17, 2024 am 08:52 AM

Penggunaan aplikasi flask: Perbandingan Gunicorn vs suWSGI Pengenalan: Flask, sebagai rangka kerja Web Python yang ringan, disukai oleh banyak pembangun. Apabila menggunakan aplikasi Flask ke persekitaran pengeluaran, memilih Antara Muka Gerbang Pelayan (SGI) yang sesuai adalah keputusan penting. Gunicorn dan uWSGI ialah dua pelayan SGI biasa Artikel ini akan menerangkannya secara terperinci.

Ketahui lebih lanjut tentang asas dan ciri Gunicorn Ketahui lebih lanjut tentang asas dan ciri Gunicorn Jan 03, 2024 am 08:41 AM

Konsep dan fungsi asas Gunicorn Gunicorn ialah alat untuk menjalankan pelayan WSGI dalam aplikasi web Python. WSGI (Antara Muka Gerbang Pelayan Web) ialah spesifikasi yang ditakrifkan oleh bahasa Python dan digunakan untuk menentukan antara muka komunikasi antara pelayan web dan aplikasi web. Gunicorn membolehkan aplikasi web Python digunakan dan dijalankan dalam persekitaran pengeluaran dengan melaksanakan spesifikasi WSGI. Fungsi Gunicorn adalah untuk

Panduan Penggunaan Gunicorn untuk Aplikasi Flask Panduan Penggunaan Gunicorn untuk Aplikasi Flask Jan 17, 2024 am 08:13 AM

Bagaimana untuk menggunakan aplikasi Flask menggunakan Gunicorn? Flask ialah rangka kerja Web Python ringan yang digunakan secara meluas untuk membangunkan pelbagai jenis aplikasi Web. Gunicorn (GreenUnicorn) ialah pelayan HTTP berasaskan Python yang digunakan untuk menjalankan aplikasi WSGI (WebServerGatewayInterface). Artikel ini akan memperkenalkan cara menggunakan Gunicorn untuk menggunakan aplikasi Flask, dengan

Apa itu Gunicorn Apa itu Gunicorn Nov 23, 2023 pm 03:07 PM

Gunicorn ialah spesifikasi antara muka gerbang pelayan web (pelayan HTTP) WSGI yang ditulis dalam Python Ia adalah pelayan yang ringan dan cekap yang direka khusus untuk menjalankan aplikasi web Python. Ciri-ciri dan fungsi utamanya termasuk: 1. Prestasi tinggi, yang boleh mengendalikan permintaan serentak yang tinggi dengan mudah 2. Stabil dan boleh dipercayai, yang boleh menyediakan operasi jangka panjang yang tahan lama, mengurangkan kemungkinan kerosakan pelayan, yang boleh lakukan Untuk mengekalkan kestabilan perkhidmatan 4. Pelbagai kaedah penggunaan, dsb.

Gunakan gabungan Gunicorn dan Flask yang tiada tandingan Gunakan gabungan Gunicorn dan Flask yang tiada tandingan Jan 17, 2024 am 10:24 AM

Gunicorn dan Flask: Kombinasi penggunaan yang sempurna, memerlukan contoh kod khusus Gambaran Keseluruhan: Sangat penting bagi pembangun untuk memilih kaedah penggunaan yang sesuai, terutamanya untuk aplikasi web Python. Antara rangka kerja web Python, Flask ialah pilihan yang sangat popular, dan Gunicorn ialah pelayan untuk menggunakan aplikasi Python. Artikel ini akan memperkenalkan gabungan Gunicorn dan Flask dan menyediakan beberapa contoh kod khusus untuk membantu pembaca

Tutorial partition pemasangan Gunicorn dan CentOS pemasangan CentOS Tutorial partition pemasangan Gunicorn dan CentOS pemasangan CentOS Feb 10, 2024 pm 09:20 PM

LINUX ialah sistem pengendalian berkuasa yang digunakan secara meluas dalam pelayan dan persekitaran pembangunan CentOS ialah sistem pengendalian sumber terbuka berdasarkan Red Hat Enterprise Linux (RHEL) dan digunakan secara meluas dalam persekitaran pelayan Memasang Gunicorn dan pembahagian pada CentOS boleh meningkatkan prestasi prestasi dan keselamatan, artikel ini akan memperincikan cara memasang Gunicorn pada CentOS dan cara membahagikannya. Pasang Gunicorn pada CentOS Gunicorn ialah pelayan WSGIHTTP Python untuk menjalankan aplikasi web Python Berikut ialah cara memasang Gunicorn pada CentOS.

Cara meningkatkan prestasi aplikasi Flask: gunakan Gunicorn Cara meningkatkan prestasi aplikasi Flask: gunakan Gunicorn Jan 17, 2024 am 10:42 AM

Bagaimanakah Gunicorn meningkatkan prestasi aplikasi Flask? Dengan perkembangan pesat Internet, prestasi aplikasi web telah menjadi semakin penting untuk pengalaman pengguna dan daya saing perusahaan. Apabila mengendalikan permintaan serentak yang tinggi, pelayan pembangunan lalai rangka kerja Flask selalunya tidak dapat memenuhi permintaan. Oleh itu, kita perlu menggunakan Gunicorn (GreenUnicorn) untuk meningkatkan prestasi aplikasi Flask. Gunicorn ialah pelayan HTTP berasaskan Python yang menggunakan pra-bercabang

See all articles