新聞中心
基本介紹
?gproc?組件提供了統(tǒng)一的信號監(jiān)聽和回調處理功能,目的是解決在程序中多個不同組件冗余的信號處理邏輯,以及接收退出信號后無法平滑析構的痛點。在沒有統(tǒng)一退出信號監(jiān)聽的組件下,當多個組件通過?GOroutine?異步監(jiān)聽信號,主?goroutine?接收到退出信號往往會直接退出,或者等待一段無法預測的時間退出,造成程序其實無法平滑退出,可能引起一些不可預料的問題。?gproc?通過統(tǒng)一的信號注冊和回調處理,使得各個組件能夠有效地接收到退出信號并做相應析構處理,使得程序的信號處理邏輯更加嚴謹。

創(chuàng)新互聯(lián)建站長期為上千客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為林周企業(yè)提供專業(yè)的成都做網站、網站制作,林周網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
相關方法:
// AddSigHandler adds custom signal handler for custom one or more signals.
func AddSigHandler(handler SigHandler, signals ...os.Signal)
// AddSigHandlerShutdown adds custom signal handler for shutdown signals:
// syscall.SIGINT,
// syscall.SIGQUIT,
// syscall.SIGKILL,
// syscall.SIGTERM,
// syscall.SIGABRT.
func AddSigHandlerShutdown(handler ...SigHandler)
// Listen blocks and does signal listening and handling.
func Listen()簡要介紹:
- ?
AddSigHanlder?方法用于添加對指定信號的監(jiān)聽和對應回調函數注冊。 - ?
AddSigHandlerShutdown?方法用于添加對常見進程退出信號的監(jiān)聽和對應回調函數注冊。 - ?
Listen?方法用于阻塞監(jiān)聽信號并自動執(zhí)行回調函數調用。
我們來看兩個示例。
示例1,使用標準庫信號監(jiān)聽
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func signalHandlerForMQ() {
var (
sig os.Signal
receivedChan = make(chan os.Signal)
)
signal.Notify(
receivedChan,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGKILL,
syscall.SIGTERM,
syscall.SIGABRT,
)
for {
sig = <-receivedChan
fmt.Println("MQ is shutting down due to signal:", sig.String())
time.Sleep(time.Second)
fmt.Println("MQ is shut down smoothly")
return
}
}
func main() {
fmt.Println("Process start, pid:", os.Getpid())
go signalHandlerForMQ()
var (
sig os.Signal
receivedChan = make(chan os.Signal)
)
signal.Notify(
receivedChan,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGKILL,
syscall.SIGTERM,
syscall.SIGABRT,
)
for {
sig = <-receivedChan
fmt.Println("MainProcess is shutting down due to signal:", sig.String())
return
}
}我們通過?go run?命令來執(zhí)行一下,隨后通過?Ctrl+C?快捷鍵退出(Mac用戶通過?Command+C?)。
$ go run signal_handler.go
Process start, pid: 21928
^CMainProcess is shutting down due to signal: interrupt
MQ is shutting down due to signal: interrupt可以看到,好可惜,那個?MQ?的?goroutine?還沒完全退出進程即被強行關閉。
示例2,使用gproc信號監(jiān)聽
package main
import (
"fmt"
"github.com/gogf/gf/v2/os/gproc"
"os"
"time"
)
func signalHandlerForMQ(sig os.Signal) {
fmt.Println("MQ is shutting down due to signal:", sig.String())
time.Sleep(time.Second)
fmt.Println("MQ is shut down smoothly")
}
func signalHandlerForMain(sig os.Signal) {
fmt.Println("MainProcess is shutting down due to signal:", sig.String())
}
func main() {
fmt.Println("Process start, pid:", os.Getpid())
gproc.AddSigHandlerShutdown(
signalHandlerForMQ,
signalHandlerForMain,
)
gproc.Listen()
}我們通過?go run?命令來執(zhí)行一下,隨后通過?Ctrl+C?快捷鍵退出(Mac用戶通過?Command+C?)。
$ go run signal_handler_gproc.go
Process start, pid: 22876
^CMQ is shutting down due to signal: interrupt
MainProcess is shutting down due to signal: interrupt
MQ is shut down smoothly看到差別了吧,所有的信號監(jiān)聽函數都正常結束后,隨后進程退出。
當前名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame gproc-信號注冊監(jiān)聽
本文URL:http://www.5511xx.com/article/cdhjech.html


咨詢
建站咨詢
