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:
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.
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.
Sebelum program ditutup dengan anggun, kami mungkin perlu menyelesaikan kerja pembersihan berikut:
Isu tamat masa: apabila kita temui Apakah yang perlu kita lakukan apabila tugas pembersihan tertentu tidak dapat diselesaikan dalam masa?
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("协程已退出") }
time
Dalam kod di atas, kami memulakan coroutine untuk membersihkan atur cara sebelum ia ditutup dengan anggun. time.WithTimeout()
4. KesimpulanApabila 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!