为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过调用结构方法来启动/停止功能

如何通过调用结构方法来启动/停止功能

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 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信