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

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

如何通過調(diào)用結(jié)構(gòu)方法來啟動/停止功能

如何通過調(diào)用結(jié)構(gòu)方法來啟動/停止功能

Go
泛舟湖上清波郎朗 2023-05-15 10:18:31
請看下面的例子。游樂場鏈接type runner struct{}func (r *runner) StopProcessing() {    // how to stop?}func (r *runner) StartProcessing() {    go func() {        for {            fmt.Println("doing stuff")            time.Sleep(1 * time.Second)        }    }()}如您所見,我有一個可以執(zhí)行操作的結(jié)構(gòu),它正在“運(yùn)行”。當(dāng)我調(diào)用該run.StartProcessing()方法時它開始運(yùn)行。for{}然后它在 goroutine 中觸發(fā)一個無休止的運(yùn)行循環(huán)。很好,但我也希望能夠停止這個過程。我真的不知道如何實(shí)現(xiàn)這一目標(biāo)。非常感謝任何幫助。
查看完整描述

3 回答

?
慕的地10843

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

您可以使用上下文來獲取超時和取消,而不需要任何額外的 API。


type runner struct{}


func (r *runner) StartProcessing(ctx context.Context) {

    go func() {

        for {

            select {

            case <-ctx.Done():

                return

            default:

            }

            fmt.Println("doing stuff")

            time.Sleep(1 * time.Second)

        }

    }()

}

這使您可以靈活地設(shè)置超時或隨時取消它。您還可以利用現(xiàn)有的上下文,這些上下文可能希望在您不知情的情況下更快地超時或取消。


// normal timeout after 10 seconds

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

defer cancel()

run.StartProcessing(ctx)


// decide to cancel early

time.Sleep(3 * time.Second)

cancel()


查看完整回答
反對 回復(fù) 2023-05-15
?
慕神8447489

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個贊

你可能會嘗試這樣的事情......你可能不需要原子,但這有效。


package main


import (

    "fmt"

    "time"

    "sync/atomic"

)


var trip = int64(0)


type runner struct{}


func (r *runner) StopProcessing() {

    atomic.AddInt64(&trip, 1)

}


func (r *runner) StartProcessing() {

    go func() {

        for {

            if trip > 0 {

                break

            }

            fmt.Println("doing stuff")

            time.Sleep(1 * time.Second)

        }

    }()

}


func newRunner() *runner {

    return &runner{}

}


func main() {

    run := newRunner()

    run.StartProcessing() 


    // now wait 4 seconds and the kill the process

    time.Sleep(4 * time.Second)

    run.StopProcessing()

}


查看完整回答
反對 回復(fù) 2023-05-15
?
慕沐林林

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個贊

通過使用通道來發(fā)出何時中斷 goroutine 的信號。您的代碼的相關(guān)部分看起來像這樣


type runner struct {

    stop chan bool

}


func (r *runner) StopProcessing() {

    r.stop <- true

}


func (r *runner) StartProcessing() {

    r.stop = make(chan bool)

    go func() {

        for {

            fmt.Println("doing stuff")

            time.Sleep(1 * time.Second)

            select {

            case _ = <-r.stop:

                close(r.stop)

                return

            default:

            }

        }

    }()

}

您可以在此處查看完整示例https://play.golang.org/p/OUn18Cprs0I


查看完整回答
反對 回復(fù) 2023-05-15
  • 3 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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