Rumah >pembangunan bahagian belakang >Golang >Mari kita bincangkan tentang kaedah penutupan elegan dalam golang

Mari kita bincangkan tentang kaedah penutupan elegan dalam golang

PHPz
PHPzasal
2023-04-27 09:11:061255semak imbas

Apabila membangunkan dan menggunakan golang, anda biasanya akan menghadapi situasi di mana anda perlu menutup atau berhenti berlari. Sebagai contoh, jika program tamat atau pengecualian berlaku, ia perlu ditutup dengan baik.

Penutupan yang anggun boleh menghentikan program dan pada masa yang sama membenarkan tugasan yang dimulakan diproses, mengelakkan masalah seperti kehilangan data dan kebocoran sumber, dan tidak menyebabkan kerugian yang tidak perlu kepada pelanggan. Artikel ini membincangkan kaedah penutupan anggun golang.

Kaedah penutupan anggun

Dalam golang, tidak sukar untuk melaksanakan penutupan anggun kita boleh melakukannya dengan menetapkan semaphore atau saluran Kaedah pelaksanaan khusus adalah seperti berikut:

Pelaksanaan melalui semaphore

package main

import (
    "log"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)

    log.Println("Starting...")

    go func() {
        <-stop
        log.Println("Stopping...")

        // 处理关闭逻辑
        time.Sleep(3 * time.Second)

        log.Println("Graceful shutdown finished")
        os.Exit(0)
    }()

    // 处理业务逻辑
    for {
        log.Println("Running...")
        time.Sleep(1 * time.Second)
    }
}

Dalam kod ini, saluran penampan isyarat jenis os. Isyarat dan panjang 1 dicipta melalui make, dan kemudian sistem pengendalian diberitahu melalui fungsi Notify dalam pakej isyarat yang kita mahu mendengar Isyarat adalah SIGINT dan SIGTERM, kedua-duanya boleh mewakili permintaan penutupan program.

Seterusnya, kami memulakan goroutine dan mendengar saluran berhenti Setelah isyarat SIGINT atau SIGTERM diterima, pelaksanaan goroutine ini akan dicetuskan. Semasa proses pelaksanaan, kami memproses logik penutupan Time.Sleep digunakan di sini untuk mensimulasikan operasi yang memakan masa untuk menguji dengan lebih baik sama ada program kami berakhir seperti biasa. Akhir sekali, sistem pengendalian dimaklumkan melalui fungsi os.Exit bahawa permintaan penutupan program telah diproses.

Dalam goroutine utama, kami memproses logik perniagaan dan mencetak "Running..." setiap saat di sini hanya contoh mudah, apabila kami memproses logik perniagaan, kami perlu menyimpannya dengan kerap. data dan sumber keluaran, dsb.

Dilaksanakan melalui saluran

package main

import (
    "log"
    "os"
    "time"
)

func main() {
    done := make(chan bool)

    log.Println("Starting...")

    go func() {
        osSignals := make(chan os.Signal, 1)
        signal.Notify(osSignals, syscall.SIGINT, syscall.SIGTERM)

        select {
        case <-osSignals:
            log.Println("Stopping...")

            // 处理关闭逻辑
            time.Sleep(3 * time.Second)

            log.Println("Graceful shutdown finished")
            done <- true
        }
    }()

    // 处理业务逻辑
    for {
        log.Println("Running...")
        time.Sleep(1 * time.Second)
        select {
        case <-done:
            return // 正常退出
        default:
            continue
        }
    }
}

Dalam kod ini, kami mencipta pembolehubah selesai jenis bool untuk menunjukkan sama ada program kami telah selesai, dan kemudian memproses logik perniagaan dalam goroutine utama dan mencetaknya kerap "Berjalan..." dan dengar dilakukan melalui fungsi pilih. Jika pembolehubah yang dilakukan ditetapkan kepada benar, atur cara akan tamat dan kembali ke fungsi utama untuk melengkapkan keluar program.

Dalam goroutine lain, kami mencipta saluran penampan isyarat jenis os. Isyarat dan panjang 1 melalui make, dan kemudian memberitahu sistem pengendalian melalui fungsi Notify dalam pakej isyarat isyarat yang ingin kami pantau dan SIGTERM. Seterusnya, dengar osSignals melalui fungsi pilih Jika isyarat SIGINT atau SIGTERM diterima, operasi tertentu akan dicetuskan.

Isyarat yang dipantau oleh program

Dalam sistem Linux, biasanya terdapat isyarat berikut:

信号名称 信号描述
SIGINT 终端中断字符,通常通过 Control+C 发出
SIGTERM 终止信号,通常用来请求程序自行停止运行
SIGHUP 挂起信号,通常表示某个终端连接已经中断,需要重新读取配置文件等
SIGUSR1-31 自定义信号
SIGKILL 杀死进程信号,无法被捕捉或忽略,只能暴力杀死进程
SIGSTOP 停止进程信号,无法被捕捉或忽略,只能暴力停止进程
SIGCONT 继续运行进程
SIGPIPE 管道破裂信号,通常表示读取数据时对方已经关闭了连接
SIGALRM 闹钟信号,用来定时触发某个操作
SIGCHLD 子进程结束信号

Biasanya, kita hanya perlu memantau isyarat SIGINT dan SIGTERM. boleh.

Peranan penutupan anggun

Melalui penutupan anggun, kami boleh mengelakkan kehilangan data, kebocoran sumber dan masalah lain yang disebabkan oleh permintaan dan operasi yang tidak diproses Untuk program dan Aplikasi yang berjalan lama amat penting. Terutamanya dalam sistem teragih dan seni bina perkhidmatan mikro, penutupan yang anggun dapat memastikan kestabilan dan prestasi sistem dengan berkesan Jika tiada fungsi pengendalian masalah yang disasarkan, program mungkin ditamatkan sewenang-wenangnya atau mencetuskan ranap selepas menerima isyarat berhenti, menyebabkan masalah yang serius kerugian yang tidak perlu kepada pelanggan.

Ringkasan

Melalui artikel ini, kami mempelajari cara menggunakan saluran golang dan pakej os/isyarat untuk penutupan yang anggun, dan cara menyelesaikan penutupan yang anggun dengan mendengar isyarat. Dalam pembangunan sebenar, penutupan biasa aplikasi adalah tugas yang sangat penting Penutupan anggun boleh meningkatkan kestabilan program dengan berkesan dan mengelakkan masalah seperti pembaziran sumber dan kehilangan data.

Atas ialah kandungan terperinci Mari kita bincangkan tentang kaedah penutupan elegan dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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