婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 解決go在函數退出后子協程的退出問題

解決go在函數退出后子協程的退出問題

熱門標簽:excel地圖標注分布數據 外呼系統用什么卡 百度地圖標注后傳給手機 涿州代理外呼系統 壽光微信地圖標注 評價高的400電話辦理 電話機器人軟件免費 阿克蘇地圖標注 外呼系統顯本地手機號

該問題來源于自己在讀fabric源碼時,看到的一個測試代碼,在一個函數中啟用協程,然后該函數退出了,由于平常沒有這樣處理過,以及受原有c++函數域的影響,認為函數退出,子協程應該也退出了呀。

這其實是自己對go協程的理解不到位引起的,go的協程作用域不是在某個函數中的,當然,如果那個函數是main函數,就符合要求了。

該代碼為solo算法的測試代碼:

func goWithWait(target func()) *waitableGo {
	wg := waitableGo{
		done: make(chan struct{}),
	}
	go func() {
		target()//該協程會阻塞在這
		close(wg.done)//用來對外通知
	}()
	//外邊結束,里邊還不結束嗎?
	return wg
}
// This test checks that if consenter is halted before a timer fires, nothing is actually written.
func TestHaltBeforeTimeout(t *testing.T) {
	batchTimeout, _ := time.ParseDuration("1ms")
	//support的構造還不清楚
	support := mockmultichannel.ConsenterSupport{
		Blocks:          make(chan *cb.Block),
		BlockCutterVal:  mockblockcutter.NewReceiver(),
		SharedConfigVal: mockconfig.Orderer{BatchTimeoutVal: batchTimeout},
	}
	defer close(support.BlockCutterVal.Block)
	bs := newChain(support)
	//bs.main是solo算法的啟動函數,是個死循環,處理函數
	wg := goWithWait(bs.main)
	defer bs.Halt()//中止
	syncQueueMessage(testMessage, bs, support.BlockCutterVal)
	bs.Halt()
	select {
	case -support.Blocks:
		t.Fatalf("Expected no invocations of Append")
	case -wg.done:
	}
}

遇到該問題后,我寫了幾個測試:

單純的函數退出,是不會影響協程的

package main
import "fmt"
var ch chan int
func test() int {
 ch = make(chan int)
 go func() {
  for {
   fmt.Println(-ch)
   fmt.Println("hello")
  }
  fmt.Println("aaaa")
 }()
 //不阻塞,那go func()不會異常退出嗎?
 //協程并不是函數,不會因為這個函數的退出而退出
 //test()啟動一個deadloop子協程,這個會在主協程main結束后被強制退出
 return 0
}
func main() {
 c := test()
 ch - 10
 fmt.Println("c", c)
}

我經常在main里邊直接寫協程的測試demo,main退出會結束主協程,之后會強制結束子協程,一般不會遇到上述在普通函數退出的問題,也沒仔細思考,所以分析源碼時有點困惑。

子協程啟動子協程,父協程的退出,并沒有影響到子協程

liudeMacBook-Pro:~ liu$ cat tmp.go 
package main
import (
	"fmt"
	"time"
)
func test() {
	go func() { //父協程
		defer func() {
			fmt.Println("exit dad")
		}()
		go func() { //子協程
			defer func() {
				fmt.Println("exit kid")
			}()
		}()
	}()
}
func main() {
	test()
	time.Sleep(time.Second)
}
liudeMacBook-Pro:~ liu$ go run tmp.go 
exit dad
exit kid

補充:golang中父子協程生命周期問題,以及通過context優雅關閉子協程

背景

上次基于mysql實現分布式鎖,今天經過測試發現問題,主要是協程不斷獲取鎖的邏輯存在問題,因為獲取鎖的協程掛掉之后,但其新生成的用來不斷更新鎖的協程并不會退出,導致鎖一直不能被釋放,究其原因如下

原因

通過下面代碼即可說明

	fmt.Println("main 函數 開始...")
	go func() {
		fmt.Println("父 協程 開始...")
		go func() {
			for {
				fmt.Println("子 協程 執行中...")
				timer := time.NewTimer(time.Second * 2)
				-timer.C
			}
		}()
		time.Sleep(time.Second*5)
		fmt.Println("父 協程 退出...")
	}()
	time.Sleep(time.Second*10)
	fmt.Println("main 函數 退出")

main 函數 開始...

父 協程 開始...

子 協程 執行中...

子 協程 執行中...

子 協程 執行中...

父 協程 退出...

子 協程 執行中...

子 協程 執行中...

main 函數 退出

由此可以看出:

main 函數退出,所有協程退出

協程無父子關系,即在父協程開啟新的協程,若父協程退出,不影響子協程

解決方式

通過context上下文來解決,當然也可以通過channel管道來解決,context解決方式如下:

fmt.Println("main 函數 開始...")
	go func() {
		ctx, cancel := context.WithCancel(context.Background())
		defer cancel()
		fmt.Println("父 協程 開始...")
		go func(ctx context.Context) {
			for {
				for {
					select {
					case -ctx.Done():
						fmt.Println("子 協程 接受停止信號...")
						return
					default:
						fmt.Println("子 協程 執行中...")
						timer := time.NewTimer(time.Second * 2)
						-timer.C
					}
				}
			}
		}(ctx)
		time.Sleep(time.Second*5)
		fmt.Println("父 協程 退出...")
	}()
	time.Sleep(time.Second*10)
	fmt.Println("main 函數 退出")

main 函數 開始...

父 協程 開始...

子 協程 執行中...

子 協程 執行中...

子 協程 執行中...

父 協程 退出...

子 協程 接受停止信號...

main 函數 退出

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Go 并發實現協程同步的多種解決方法
  • go等待一組協程結束的操作方式
  • golang協程池模擬實現群發郵件功能
  • Go使用協程交替打印字符
  • Golang 之協程的用法講解
  • go 協程返回值處理操作
  • 淺談golang for 循環中使用協程的問題
  • Go并發:使用sync.WaitGroup實現協程同步方式

標簽:吐魯番 汕頭 蘭州 雞西 銅川 梅河口 重慶 欽州

巨人網絡通訊聲明:本文標題《解決go在函數退出后子協程的退出問題》,本文關鍵詞  解決,在,函數,退出,后,子,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決go在函數退出后子協程的退出問題》相關的同類信息!
  • 本頁收集關于解決go在函數退出后子協程的退出問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲免费在线播放| 亚洲国产wwwccc36天堂| 五月婷婷色综合| 国产一区二区网址| 欧美成人乱码一区二区三区| 亚洲成人激情综合网| 欧美三级韩国三级日本一级| 亚洲线精品一区二区三区| 97精品久久久午夜一区二区三区 | 欧美乱妇15p| 天天射综合影视| 日韩免费高清av| 经典三级视频一区| 欧美国产成人精品| 欧美亚洲国产bt| 丝袜美腿亚洲色图| 久久亚洲二区三区| 99精品在线免费| 亚洲国产一区二区a毛片| 日韩一区二区三区免费看| 国产一区二区三区国产| 亚洲欧美中日韩| 91精品国产一区二区三区| 国产成人免费在线| 一区二区三区视频在线观看| 欧美日韩国产精品成人| 久久精品99国产精品| 国产丝袜在线精品| 欧美日韩亚洲综合在线| 精品一区二区三区在线播放视频| 国产午夜精品美女毛片视频| 欧美疯狂做受xxxx富婆| 精品一二三四在线| 亚洲欧洲制服丝袜| 久久天天做天天爱综合色| 欧美色视频在线观看| 精品无人码麻豆乱码1区2区 | 91.xcao| 岛国精品一区二区| 亚洲不卡av一区二区三区| 精品国产a毛片| 欧美在线视频全部完| 国产精品18久久久久久久久久久久 | 成人av网站在线观看| 亚洲福利一二三区| 亚洲欧洲一区二区在线播放| 日韩欧美视频一区| 欧美日本国产一区| 91老师片黄在线观看| 国产成人av影院| 国产一区视频在线看| 激情欧美一区二区三区在线观看| 日韩黄色片在线观看| 亚洲一区二区视频在线| 亚洲欧美日韩久久| 国产精品无遮挡| 国产网站一区二区| 久久久www免费人成精品| 久久综合狠狠综合久久综合88 | 欧美精品欧美精品系列| 97久久超碰精品国产| 成人app在线观看| 国产91在线|亚洲| 国产91精品在线观看| 国产91精品免费| 99亚偷拍自图区亚洲| 成人av手机在线观看| aaa欧美日韩| 91黄色激情网站| 欧美男人的天堂一二区| 在线成人免费观看| 日韩午夜激情电影| 国产亚洲女人久久久久毛片| 国产欧美精品一区aⅴ影院| 久久蜜桃av一区二区天堂| 国产欧美一区二区三区在线老狼| 日本一区二区三区dvd视频在线| 亚洲精品一区二区精华| 欧美国产一区视频在线观看| 最新不卡av在线| 一区二区日韩av| 蜜臀av性久久久久蜜臀aⅴ| 老司机午夜精品99久久| 成人免费视频播放| 91久久一区二区| 欧美一区二视频| 国产日韩精品视频一区| 亚洲欧美福利一区二区| 久久精品免费看| 91女人视频在线观看| 777xxx欧美| 国产精品乱人伦一区二区| 亚洲国产裸拍裸体视频在线观看乱了 | 中日韩免费视频中文字幕| 亚洲欧美另类综合偷拍| 视频一区国产视频| 国产河南妇女毛片精品久久久 | 国产成人在线色| 色噜噜狠狠成人网p站| 欧美一区二区三级| 亚洲欧洲av在线| 麻豆精品一区二区| 99久久99久久久精品齐齐 | 日韩一区二区三区在线观看| 久久久久国产一区二区三区四区| 亚洲少妇屁股交4| 免费成人美女在线观看| 91色在线porny| 精品国产乱子伦一区| 一区二区成人在线观看| 国产大陆a不卡| 欧美一级欧美一级在线播放| 亚洲精选免费视频| 成人午夜免费视频| 欧美精品一区二区三区蜜桃视频 | 欧美日韩一区在线| 国产精品水嫩水嫩| 极品尤物av久久免费看| 欧美日本一区二区三区四区| 亚洲男人的天堂一区二区| 国产91清纯白嫩初高中在线观看| 精品伦理精品一区| 日韩高清中文字幕一区| 在线免费观看日韩欧美| 中文字幕+乱码+中文字幕一区| 精品一区中文字幕| 日韩欧美国产成人一区二区| 自拍偷拍国产精品| 成人黄页毛片网站| 亚洲国产精品v| 国产凹凸在线观看一区二区| 久久在线观看免费| 国产精品羞羞答答xxdd| 国产日产欧美一区| 国产成人免费在线| 国产日韩精品一区二区浪潮av| 国产精品一区三区| 久久午夜免费电影| 国产精品99久久久久久有的能看 | 国产视频一区二区三区在线观看 | 精品国产露脸精彩对白| 美女久久久精品| 欧美一区二区黄色| 精品中文字幕一区二区| 精品乱人伦小说| 国产综合色在线视频区| 国产免费成人在线视频| 99re成人在线| 亚洲乱码国产乱码精品精98午夜 | 91蜜桃视频在线| 亚洲精品国产视频| 4438成人网| 国产中文一区二区三区| 国产亲近乱来精品视频| 色婷婷亚洲婷婷| 日本va欧美va欧美va精品| 国产欧美一区二区三区在线看蜜臀| 99久久国产综合色|国产精品| 亚洲二区视频在线| 337p日本欧洲亚洲大胆色噜噜| 国产91精品在线观看| 亚洲免费av观看| 欧美mv和日韩mv的网站| 成人免费视频免费观看| 亚洲电影一区二区| 精品蜜桃在线看| 91在线无精精品入口| 亚洲国产婷婷综合在线精品| 久久一区二区三区国产精品| 99久久免费视频.com| 日本伊人精品一区二区三区观看方式| 久久综合九色综合久久久精品综合 | 欧美精品一区二区三区在线| 大陆成人av片| 青青草成人在线观看| 国产精品网站在线| 555夜色666亚洲国产免| 成人av在线一区二区三区| 午夜精品福利久久久| 国产精品美女www爽爽爽| 日韩一区二区三区四区| 色国产精品一区在线观看| 国产在线精品不卡| 蜜桃视频在线观看一区二区| 《视频一区视频二区| 亚洲精品一区二区三区精华液| 欧美少妇一区二区| 色哟哟在线观看一区二区三区| 九九精品一区二区| 天天av天天翘天天综合网 | av影院午夜一区| 国产一区亚洲一区| 美女视频黄免费的久久 | 精品久久久久99| 欧美在线短视频| bt7086福利一区国产| 国产成人一级电影| 国产在线观看免费一区| 久久精品国产999大香线蕉| 婷婷激情综合网|