亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何通過調用結構方法來啟動/停止功能

如何通過調用結構方法來啟動/停止功能

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)        }    }()}如您所見,我有一個可以執行操作的結構,它正在“運行”。當我調用該run.StartProcessing()方法時它開始運行。for{}然后它在 goroutine 中觸發一個無休止的運行循環。很好,但我也希望能夠停止這個過程。我真的不知道如何實現這一目標。非常感謝任何幫助。
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超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)

        }

    }()

}

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


// 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()


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

TA貢獻1780條經驗 獲得超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()

}


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

TA貢獻2016條經驗 獲得超9個贊

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


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


查看完整回答
反對 回復 2023-05-15
  • 3 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號