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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果一個 Goroutine 正在運行,請停止它

如果一個 Goroutine 正在運行,請停止它

Go
SMILET 2022-08-24 15:44:30
我有一個類似于如何用一個小扭曲來阻止Goroutine的問題。我不確定戈魯丁是否正在運行。var quit = make(chan bool)func f1() {    go func() {        t := time.NewTimer(time.Minute)        select {        case <-t.C:            // Do stuff        case <-quit:            return        }    }()}func f2() {    quit <- true}如果在不到一分鐘后被調(diào)用,則 goroutine 返回。但是,如果它在一分鐘后被調(diào)用,則goroutine將已經(jīng)返回并會阻塞。如果 goroutine 正在運行,我想取消它,否則不執(zhí)行任何操作。f2()f1()f2()f2()我在這里試圖實現(xiàn)的是執(zhí)行一項任務(wù),當且僅當它在創(chuàng)建后的一分鐘內(nèi)沒有被取消。澄清:沒有什么可以阻止被多次調(diào)用。f2()一次只有一個戈魯丁在奔跑。的調(diào)用方將確保每分鐘調(diào)用的次數(shù)不超過一次。f1()
查看完整描述

2 回答

?
慕仙森

TA貢獻1827條經(jīng)驗 獲得超8個贊

使用上下文。


使用可能被取消的上下文運行。使用關(guān)聯(lián)的取消函數(shù)運行。f1f2


func f1(ctx context.Context) {

    go func(ctx context.Context) {

        t := time.NewTimer(time.Minute)

        select {

        case <-t.C:

            // Do stuff

        case <-ctx.Done():

            return

        }

    }(ctx)

}


func f2(cancel context.CancelFunc) {

    cancel()

}

稍后,為了協(xié)調(diào)這兩個函數(shù),您將執(zhí)行以下操作:


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

    f1(ctx)

    f2(cancel)

您還可以試驗該函數(shù)以合并外部定義的超時。context.WithTimeout


如果您不知道是否已經(jīng)有一個goroutine在運行,您可以像上面那樣初始化和變量,但不要將它們傳遞給任何東西。這樣就避免了必須檢查 .ctxcancelnil


請記住將 ctx 和 cancel 視為要復(fù)制的變量,而不是引用,因為您不希望多個 goroutine 共享內(nèi)存 - 這可能會導(dǎo)致爭用條件。


查看完整回答
反對 回復(fù) 2022-08-24
?
jeck貓

TA貢獻1909條經(jīng)驗 獲得超7個贊

您可以為通道指定緩沖區(qū)大小為 1。這意味著您可以在不阻塞的情況下向其發(fā)送一個值,即使該值沒有立即(或根本沒有收到)也是如此。

var quit = make(chan bool, 1)

我認為最好的答案是更好的,這只是另一種可以轉(zhuǎn)化為其他情況的解決方案。


查看完整回答
反對 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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