Rumah  >  Artikel  >  pembangunan bahagian belakang  >  acara penutupan program golang

acara penutupan program golang

王林
王林asal
2023-05-14 21:43:38556semak imbas

Apabila menulis program Golang, kita selalunya perlu mengendalikan acara penutupan program. Terutamanya dalam program yang berjalan lama, menutup program dengan segera dan anggun boleh mengelakkan kebocoran sumber dan rasuah data. Artikel ini akan memperkenalkan cara mengendalikan acara penutupan program dengan anggun di Golang.

1. Pencetusan acara penutupan program

Apabila aplikasi Golang menerima isyarat gangguan daripada sistem, ia akan mencetuskan acara penutupan program. Di bawah sistem Linux, isyarat sampukan boleh dicetuskan secara manual oleh pengguna atau dijana secara automatik oleh sistem, seperti Ctrl+C, Ctrl+Break, Kill dan isyarat lain.

2. Keperluan penutupan program dengan bijak

Semasa menjalankan program, kita selalunya perlu menyelenggara dan menduduki beberapa sumber, seperti sambungan pangkalan data, pemegang fail, pemasa, dsb. . Apabila kami tidak mengeluarkan sumber ini tepat pada masanya, masalah seperti kebocoran memori atau kerosakan data mungkin berlaku. Acara penutupan program memainkan peranan dalam menangani masalah ini.

Terdapat banyak cara untuk mengendalikan acara penutupan program, tetapi yang paling biasa ialah menutup program dengan anggun.

3. Cara menutup program dengan anggun

Menutup program dengan anggun dibahagikan kepada tiga langkah berikut:

  1. Daftar fungsi mendengar acara penutupan

Fungsi mendengar acara penutupan pendaftaran dilaksanakan melalui pakej isyarat Golang. Selepas pendaftaran, apabila program menerima acara penutupan, ia akan memanggil fungsi mendengar untuk pemprosesan.

Berikut ialah program ringkas yang menunjukkan cara mendaftarkan fungsi mendengar untuk acara penutupan.

package main

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

func main() {
    // 注册程序关闭监听函数
    signals := make(chan os.Signal, 1)
    signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)

    // 等待程序关闭事件
    <-signals
    fmt.Println("收到程序关闭事件,开始优雅关闭程序")

    // 在此处添加程序关闭前的清理操作
    time.Sleep(time.Second)
    fmt.Println("程序已关闭")
}

Dalam kod di atas, kami mendaftarkan fungsi mendengar isyarat signal.Notify() dan SIGINT melalui fungsi SIGTERM Apabila program menerima kedua-dua isyarat ini, fungsi mendengar akan dimulakan.

  1. Cetuskan acara penutup

Dalam program, kita boleh mencetuskan acara penutup dalam apa jua cara. Dalam kes paling mudah, kita boleh mengeluarkan isyarat Ctrl + C. Tetapi dalam senario sebenar, kita mungkin perlu mencetuskan peristiwa penutupan dengan cara lain. Sebagai contoh, kami mungkin memulakan coroutine untuk menyemak dengan kerap sama ada peristiwa penutupan telah dicetuskan supaya program boleh ditutup dengan anggun tepat pada masanya.

Berikut ialah program yang menunjukkan cara melaksanakan semakan tetap acara penutupan melalui coroutine:

package main

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

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

    go func() {
        for {
            select {
            case <-signals:
                fmt.Println("收到程序关闭事件,开始优雅关闭程序")
                time.Sleep(time.Second)
                fmt.Println("程序已关闭")
                os.Exit(0)
            }
        }
    }()

    fmt.Println("程序已启动")
    for {
        time.Sleep(time.Second)
        fmt.Println("程序运行中......")
    }
}

Dalam kod di atas, kami melaksanakan semakan tetap acara penutupan program dengan memulakan coroutine. Apabila coroutine menerima acara penutupan, program akan ditutup dengan anggun.

  1. Kerja pembersihan sebelum program ditutup dengan anggun

Sebelum program ditutup dengan anggun, kami mungkin perlu menyelesaikan kerja pembersihan berikut:

  • Tutup pangkalan data Connect;
  • Kosongkan cache;
  • Tutup fail IO; operasi membantu memastikan kestabilan prestasi program dan integriti data. Semasa menjalankan tugas pembersihan ini, kami mungkin perlu mempertimbangkan dua isu berikut:
  • Isu urutan: kerja pembersihan perlu dijalankan dalam urutan tertentu

Isu tamat masa: apabila kita temui Apakah yang perlu kita lakukan apabila tugas pembersihan tertentu tidak dapat diselesaikan dalam masa?

  • Isu tamat masa biasanya boleh dikendalikan melalui pakej
  • Golang, seperti menetapkan tamat masa melalui fungsi
  • atau memulakan coroutine untuk membersihkan.
Berikut ialah program yang menunjukkan cara membersihkan atur cara dengan anggun apabila ia dimatikan:

package main

import (
    "context"
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

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

    go func() {
        for {
            select {
            case <-signals:
                fmt.Println("收到程序关闭事件,开始优雅关闭程序")

                // 在此处添加程序关闭前的清理操作
                ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
                go cleanup(ctx)
                <-ctx.Done()

                time.Sleep(time.Second)
                fmt.Println("程序已关闭")
                os.Exit(0)
            }
        }
    }()

    fmt.Println("程序已启动")
    for {
        time.Sleep(time.Second)
        fmt.Println("程序运行中......")
    }
}

func cleanup(ctx context.Context) {
    fmt.Println("开始清理数据库连接")
    time.Sleep(time.Second * 3)
    fmt.Println("数据库连接已关闭")

    fmt.Println("开始清理缓存")
    time.Sleep(time.Second * 3)
    fmt.Println("缓存已清理完成")

    fmt.Println("开始清理文件IO")
    time.Sleep(time.Second * 3)
    fmt.Println("文件IO已关闭")

    fmt.Println("开始等待协程退出")
    time.Sleep(time.Second * 3)
    fmt.Println("协程已退出")
}
timeDalam kod di atas, kami memulakan coroutine untuk membersihkan atur cara sebelum ia ditutup dengan anggun. time.WithTimeout()

4. Kesimpulan

Apabila menulis program Golang, pemprosesan acara penutupan program adalah sangat penting. Menutup program dengan anggun boleh mengelakkan masalah seperti rasuah data dan kebocoran sumber. Apabila melaksanakan penutupan anggun, kita perlu mendaftarkan fungsi mendengar acara penutupan, mencetuskan peristiwa penutupan dan melakukan kerja pembersihan. Apabila berurusan dengan kerja pembersihan, kita perlu mengambil kira isu tamat masa dan isu penjujukan.

Saya harap artikel ini dapat membantu anda lebih memahami cara mengendalikan acara penutupan program dalam program Golang dengan anggun. Jika anda mempunyai pemikiran atau soalan lain, sila tinggalkan mesej di ruang komen.

Atas ialah kandungan terperinci acara penutupan program 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