日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame gproc-信號(hào)注冊(cè)監(jiān)聽

基本介紹

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

創(chuàng)新互聯(lián)建站長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為林周企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作,林周網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

相關(guān)方法:

// 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?方法用于添加對(duì)指定信號(hào)的監(jiān)聽和對(duì)應(yīng)回調(diào)函數(shù)注冊(cè)。
  • ?AddSigHandlerShutdown?方法用于添加對(duì)常見進(jìn)程退出信號(hào)的監(jiān)聽和對(duì)應(yīng)回調(diào)函數(shù)注冊(cè)。
  • ?Listen?方法用于阻塞監(jiān)聽信號(hào)并自動(dòng)執(zhí)行回調(diào)函數(shù)調(diào)用。

我們來看兩個(gè)示例。

示例1,使用標(biāo)準(zhǔn)庫信號(hào)監(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

可以看到,好可惜,那個(gè)?MQ?的?goroutine?還沒完全退出進(jìn)程即被強(qiáng)行關(guān)閉。

示例2,使用gproc信號(hào)監(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

看到差別了吧,所有的信號(hào)監(jiān)聽函數(shù)都正常結(jié)束后,隨后進(jìn)程退出。


文章題目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame gproc-信號(hào)注冊(cè)監(jiān)聽
本文路徑:http://www.dlmjj.cn/article/cdhjech.html