第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

停止單個(gè) goroutine 的最佳方法?

停止單個(gè) goroutine 的最佳方法?

Go
瀟湘沐 2022-06-27 15:45:43
在我的程序中,我有幾個(gè) go-routines,它們本質(zhì)上是在運(yùn)行無窮無盡的進(jìn)程。為什么?您可能會(huì)問,長話短說,這是我整個(gè)應(yīng)用程序的目的,所以改變它是不可能的。我想讓用戶能夠停止單個(gè) go-routine。我知道我可以使用 channel 來通知 go-routines 停止,但是可能有我有 10 個(gè) go-routines 正在運(yùn)行而我只想停止 1 個(gè)的情況。問題是 go-routines 的數(shù)量我想運(yùn)行是動(dòng)態(tài)的并且基于用戶輸入。對我來說,添加動(dòng)態(tài)停止 go-routine 并允許單打停止的最佳方法是什么?
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

您需要設(shè)計(jì)一個(gè)地圖來管理上下文。


假設(shè)您已經(jīng)知道上下文的用法。它可能看起來像:


ctx, cancel := context.WithCancel(ctx.TODO())


go func(ctx){

    for {


        select {


           case <-ctx.Done():

                return

           default:

              // job

        }

    }

}(ctx)


cancel()

好的,現(xiàn)在您可以將您的問題轉(zhuǎn)換為另一個(gè)問題,它可能稱為“如何管理許多 goroutine 的上下文”


type GoroutineManager struct{

    m sync.Map

}

func (g *GoroutineManager) Add(cancel context.CancelFunc, key string)) {

    g.m.Store(key, cancel)

}


func (g *GoroutineManager) KillGoroutine(key string) {

    cancel, exist := g.m.Load(key)

    if exist {

        cancel()

    }

}


好的,現(xiàn)在您可以像這樣管理您的 goroutine:


ctx, cancel := context.WithCancel(ctx.TODO())


manager.Add(cancel, "routine-job-1")

go func(ctx){

    for {


        select {


           case <-ctx.Done():

                return

           default:

              // job

        }

    }

}(ctx)



// kill it as your wish

manager.KillGoroutine("routine-job-1")


查看完整回答
反對 回復(fù) 2022-06-27
  • 1 回答
  • 0 關(guān)注
  • 112 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)