最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoLang使goroutine停止的五種方法實例

 更新時間:2022年07月14日 15:28:04   作者:GoGo在努力  
goroutine是Go并行設(shè)計的核心,下面這篇文章主要給大家介紹了關(guān)于GoLang使goroutine停止的五種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

GoLang之使goroutine停止的5種方法

1.goroutine停止介紹

goroutine是Go語言實現(xiàn)并發(fā)編程的利器,簡單的一個指令go function就能啟動一個goroutine;

但是,Go語言并沒有提供終止goroutine的接口,也就是說,我們不能從外部去停止一個goroutine,只能由goroutine內(nèi)部退出(main函數(shù)終止除外);

我們有很多情況下需要主動關(guān)閉goroutine,如需要實現(xiàn)一個系統(tǒng)自動熔斷的功能就需要主動關(guān)閉goroutine

2.goroutine停止的5種方法

2.1使用for-range

for-range從channel上接收值,直到channel關(guān)閉,該結(jié)構(gòu)在Go并發(fā)編程中很常用,這對于從單一通道上獲取數(shù)據(jù)去執(zhí)行某些任務(wù)是十分方便的

2.2使用for-select(向退出通道發(fā)出退出信號)

當(dāng)channel比較多時,for-range結(jié)構(gòu)借不是很方便了;

Go語言提供了另外一種和channel相關(guān)的語法: select;

select能夠讓goroutine在多個通信操作上等待(可以理解為監(jiān)聽多個channel);

由于這個特性,for-select結(jié)構(gòu)在Go并發(fā)編程中使用的頻率很高;

我在使用Go的開發(fā)中,這是我用的最多的一種組合形式:

for {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->
select {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->
}
}

對于for-select結(jié)構(gòu),一般我會定義一個特定的退出通道,用于接收退出的信號,如quit

2.3使用for-select(關(guān)閉退出通道)

當(dāng)我們就需要向quit通道中發(fā)送100次數(shù)據(jù),如果再用以上的代碼就很麻煩,有一個很簡單的方法,關(guān)閉channel,這樣所有監(jiān)聽quit channel的goroutine就都會收到關(guān)閉信號,上面的代碼只要做一個很小的替換就能工作

2.4使用for-select(關(guān)閉多個channel)

如果select上監(jiān)聽了多個通道,需要所有的通道都關(guān)閉后才能結(jié)束goroutine,這里就利用select的一個特性,select不會在nil的通道上進行等待,因此將channel賦值為nil即可,此外,還需要利用channel的ok值

var wg sync.WaitGroup
func worker(in1, in2 <-chan int) {
	defer wg.Done()
	for {
		select {
		case v, ok := <-in1:
			if !ok {
				fmt.Println("收到退出信號")
				in1 = nil
			}
			// do something
			fmt.Println(v)
		case v, ok := <-in2:
			if !ok {
				fmt.Println("收到退出信號")
				in2 = nil
			}
			// do something
			fmt.Println(v)
		}
		// select已經(jīng)結(jié)束,我們需要判斷兩個通道的狀態(tài)
		// 都為nil則結(jié)束當(dāng)前goroutine
		if in1 == nil && in2 == nil {
			return
		}
	}
}
func main() {
	in1 := make(chan int) // 退出通道,接收
	in2 := make(chan int)
	wg.Add(2)
	go worker(in1, in2)
	go worker(in2, in2)
	for i := 0; i < 3; i++ {
		in1 <- i
		time.Sleep(1 * time.Second)
		in2 <- i
	}
	close(in1)
	close(in2)
	wg.Wait()
}

2.5使用context包

context包是官方提供的一個用于控制多個goroutine寫作的包;

使用context的cancel信號,可以終止goroutine的運行,context是可以向下傳遞的

總結(jié)

到此這篇關(guān)于GoLang使goroutine停止的五種方法的文章就介紹到這了,更多相關(guān)GoLang goroutine停止內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Golang 切片(slice)擴容機制的原理

    淺談Golang 切片(slice)擴容機制的原理

    我們知道 Golang 切片在容量不足的情況下會進行擴容,擴容的原理是怎樣的呢,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Go語言中常見的文件操作分享

    Go語言中常見的文件操作分享

    文件操作應(yīng)該是應(yīng)用程序里非常常見的一種操作,無論是哪種應(yīng)用場景,幾乎都離不開文件的基本操作。Go語言中提供了三個不同的包去處理文件,下午就來說說它們的具體使用
    2023-01-01
  • golang進行簡單權(quán)限認證的實現(xiàn)

    golang進行簡單權(quán)限認證的實現(xiàn)

    本文主要介紹了golang簡單權(quán)限認證的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • golang?xorm?自定義日志記錄器之使用zap實現(xiàn)日志輸出、切割日志(最新)

    golang?xorm?自定義日志記錄器之使用zap實現(xiàn)日志輸出、切割日志(最新)

    這篇文章主要介紹了golang?xorm?自定義日志記錄器,使用zap實現(xiàn)日志輸出、切割日志,包括連接postgresql數(shù)據(jù)庫的操作方法及?zap日志工具?,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Go Asynq異步任務(wù)處理的實現(xiàn)

    Go Asynq異步任務(wù)處理的實現(xiàn)

    Asynq是一個新興的異步任務(wù)處理解決方案,它提供了輕量級的、易于使用的API,本文主要介紹了Go Asynq異步任務(wù)處理的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-06-06
  • 基于golang的輕量級工作流框架Fastflow

    基于golang的輕量級工作流框架Fastflow

    這篇文章主要介紹了基于golang的輕量級工作流框架Fastflow,fastflow 執(zhí)行任務(wù)的過程會涉及到幾個概念:Dag, Task, Action, DagInstance,本文給大家分享完整流程,需要的朋友可以參考下
    2022-05-05
  • 使用go語言將單反斜杠改為雙反斜杠的方法

    使用go語言將單反斜杠改為雙反斜杠的方法

    最近開發(fā)的時候遇到這么個問題,就是在window上獲取了文件目錄的字段,然后將這個絕對路徑保存到數(shù)據(jù)庫,但是前端展示的時候路徑的雙反斜杠變成了單反斜杠,本文給大家介紹了使用go語言將單反斜杠改為雙反斜杠的方法,需要的朋友可以參考下
    2024-01-01
  • Go語言中JSON文件的讀寫操作

    Go語言中JSON文件的讀寫操作

    本文主要介紹了Go語言JSON文件的讀寫操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 深入理解 Go 語言中的 Context

    深入理解 Go 語言中的 Context

    這篇文章主要介紹了 理解 Go 語言中的 Context,需要的朋友可以參考下
    2020-06-06
  • 詳解Golang中select的使用與源碼分析

    詳解Golang中select的使用與源碼分析

    select?是?Go?提供的?IO?多路復(fù)用機制,可以用多個?case?同時監(jiān)聽多個?channl?的讀寫狀態(tài)。本文將從源碼角度帶大家了解一下select的使用,需要的可以參考一下
    2022-12-12

最新評論

米泉市| 泰安市| 农安县| 沙湾县| 资兴市| 丹凤县| 承德市| 搜索| 石台县| 仁化县| 琼海市| 合作市| 青海省| 大同市| 都安| 富蕴县| 通江县| 肇庆市| 烟台市| 建宁县| 东台市| 克东县| 大厂| 紫金县| 忻州市| 秦皇岛市| 扶风县| 沂水县| 平陆县| 宜川县| 德州市| 施甸县| 伊金霍洛旗| 六枝特区| 遂昌县| 嘉义市| 中牟县| 壤塘县| 阿瓦提县| 衢州市| 越西县|