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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
go語言怎么退出 go語言如何

如何優(yōu)雅地等待所有的goroutine退出

goroutine和channel是Go語言非常棒的特色,它們提供了一種非常輕便易用的并發(fā)能力。但是當您的應用進程中有很多goroutine的時候,如何在主流程中等待所有的goroutine 退出呢?

站在用戶的角度思考問題,與客戶深入溝通,找到天門網(wǎng)站設計與天門網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站設計、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務覆蓋天門地區(qū)。

1 通過Channel傳遞退出信號

Go的一大設計哲學就是:通過Channel共享數(shù)據(jù),而不是通過共享內存共享數(shù)據(jù)。主流程可以通過channel向任何goroutine發(fā)送停止信號,就像下面這樣:

func run(done chan int) {

for {

select {

case -done:

fmt.Println("exiting...")

done - 1

break

default:

}

time.Sleep(time.Second * 1)

fmt.Println("do something")

}

}

func main() {

c := make(chan int)

go run(c)

fmt.Println("wait")

time.Sleep(time.Second * 5)

c - 1

-c

fmt.Println("main exited")

}

這種方式可以實現(xiàn)優(yōu)雅地停止goroutine,但是當goroutine特別多的時候,這種方式不管在代碼美觀上還是管理上都顯得笨拙不堪。

2 使用waitgroup

sync包中的Waitgroup結構,是Go語言為我們提供的多個goroutine之間同步的好刀。下面是官方文檔對它的描述:

A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for.

Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished.

通常情況下,我們像下面這樣使用waitgroup:

創(chuàng)建一個Waitgroup的實例,假設此處我們叫它wg

在每個goroutine啟動的時候,調用wg.Add(1),這個操作可以在goroutine啟動之前調用,也可以在goroutine里面調用。當然,也可以在創(chuàng)建n個goroutine前調用wg.Add(n)

當每個goroutine完成任務后,調用wg.Done()

在等待所有goroutine的地方調用wg.Wait(),它在所有執(zhí)行了wg.Add(1)的goroutine都調用完wg.Done()前阻塞,當所有goroutine都調用完wg.Done()之后它會返回。

那么,如果我們的goroutine是一匹不知疲倦的牛,一直孜孜不倦地工作的話,如何在主流程中告知并等待它退出呢?像下面這樣做:

type Service struct {

// Other things

ch chan bool

waitGroup *sync.WaitGroup

}

func NewService() *Service {

s := Service{

// Init Other things

ch: make(chan bool),

waitGroup: sync.WaitGroup{},

}

return s

}

func (s *Service) Stop() {

close(s.ch)

s.waitGroup.Wait()

}

func (s *Service) Serve() {

s.waitGroup.Add(1)

defer s.waitGroup.Done()

for {

select {

case -s.ch:

fmt.Println("stopping...")

return

default:

}

s.waitGroup.Add(1)

go s.anotherServer()

}

}

func (s *Service) anotherServer() {

defer s.waitGroup.Done()

for {

select {

case -s.ch:

fmt.Println("stopping...")

return

default:

}

// Do something

}

}

func main() {

service := NewService()

go service.Serve()

// Handle SIGINT and SIGTERM.

ch := make(chan os.Signal)

signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)

fmt.Println(-ch)

// Stop the service gracefully.

service.Stop()

}

go語言--Goroutines

1、goroutine:在go語言中,每一個并發(fā)的執(zhí)行單元叫做goroutine,如果一個程序中包含多個goroutine,對兩個函數(shù)的調用則可能發(fā)生在同一時刻

2、main goroutine:當一個程序啟動時,其主函數(shù)即在一個單獨的goroutine中運行,我們叫他為main gorountine

3、go goroutine:新的goroutine會用go語句來創(chuàng)建,go+函數(shù)名,go語句會使其語句中的函數(shù)在一新創(chuàng)建的goroutine中運行,而go語句本身會迅速地完成

4、goroutine的退出:主函數(shù)返回時,所有的goroutine都會被直接打斷,程序退出,除了從主函數(shù)退出或者終止程序之外,沒有其他方法能夠讓一個goroutine來打斷另一個的執(zhí)行,但是可以通過另一種方式來實現(xiàn)這個目的,通過goroutine之間的通信來讓一個goroutine請求其他的goroutine,并讓請求的goroutine自行結束執(zhí)行

golangdllfreelibrary退出

golangdllfreelibrary通過程序退出。定義一個【chanstruct{}。

1、調用【close()】函數(shù)關閉channel,將退出信號傳遞給每一個goroutine。

2、取到【

回答于?2022-12-21


網(wǎng)站名稱:go語言怎么退出 go語言如何
鏈接URL:http://www.dlmjj.cn/article/dococjd.html