日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

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

基本介紹

?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