停止使用上下文执行简单功能

时间:2020-07-20 11:38:28

标签: go concurrency

据我了解,上下文库的主要目的是停止执行所有儿童的RPC和HTTP请求。或者用简单的语言,我们可以说借助上下文库,我们可以将触发器传递给函数调用

这是我要使用上下文解决的抽象问题。

package main

import (
    "context"
    "fmt"
    "time"
)

func PrintAndStop(ctx context.Context, numberOfTimePrint int, msg string) {
    communicationChannel := make(chan bool)
    go func() {
        for i := 0; i < numberOfTimePrint; i++ {
            fmt.Println(msg)
            time.Sleep(time.Second)
        }
        communicationChannel <- true
    }()
    select {
    case <-communicationChannel:
        fmt.Println("process has been completed")
    case <-ctx.Done():
        fmt.Println("closing call from the main function")
    }
}

func main() {
    ctx := context.Background()
    ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
    defer cancel()
    PrintAndStop(ctx, 5*time.Second, "testing")

    time.Sleep(5 * time.Second)
}

以下代码的输出是:

testing
testing
testing
closing call from the main function
testing
testing
以下代码段的

链接位于此处:https://play.golang.org/p/4Ntwn3wYOiT PrintAndStop是一种以给定的次数以1秒为间隔打印一些消息的方法。 借助上下文库,我希望将控制权交给主要函数,以在需要时停止PrintAndStop的执行。 main末尾的time.Sleep(5 * time.Second)只是函数调用后主函数没有结束的表示。

我知道以下重构,但是无法以这种方式重构实际问题。

func PrintAndStop(ctx context.Context, numberOfTimePrint int, msg string) {
    completed := true
    for i := 0; i < numberOfTimePrint; i++ {
        select {
        case <-time.After(1 * time.Second):
            fmt.Println(msg)
        case <-ctx.Done():
            fmt.Println("closing call from the main function")
            completed = false
            break
        }
    }
    if completed {
        fmt.Println("function execution is completed")
    }
}

注意:我很高兴在Go语言中使用context库的某些扩展或全新的库来解决上述问题。

1 个答案:

答案 0 :(得分:2)

我想控制主函数以随时停止SELECT * FROM INSTALL LEFT JOIN COMPONENT ON INSTALLNO = COM$INSTALL WHERE COM$COMPONENT IN ( 'NPW', 'APS') 的执行

然后,您需要检查该循环内的上下文是否已取消

PrintAndStop