您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    在 Go 言语中管理 Concurrency 的三种方式(2)
    时间:2020-08-12 12:07 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    下面的例子可以发现,用了一个 Gogourtine 和 Channel 来控制。可以想像当后台有有数个 Goroutine 的时分,我们就需求用多个 Channel 才能停止控制,也许 Goroutine 内又会产生 Goroutine,开发者这时分就会发现曾经无法单纯运用 Channel 来控制多个 Goroutine 了。这时分处置方式会是传递 Context。

    Context

    大家可以想像,明天有一个后台义务 A,A 义务又产生了 B 义务,B 义务又产生了 C 义务,也就是可以按照此形式不缎历生下去,假定中途我们需求中止 A 义务,而 A 又必须通知 B 及 C 要一同中止,这时分经过 context 方式是最快的了。

    package main 

     

    import ( 

        "context" 

        "fmt" 

        "time" 

     

    func foo(ctx context.Context, name string) { 

        go bar(ctx, name) // A calls B 

        for { 

            select { 

            case <-ctx.Done(): 

                fmt.Println(name"A Exit"

                return 

            case <-time.After(1 * time.Second): 

                fmt.Println(name"A do something"

            } 

        } 

     

    func bar(ctx context.Context, name string) { 

        for { 

            select { 

            case <-ctx.Done(): 

                fmt.Println(name"B Exit"

                return 

            case <-time.After(2 * time.Second): 

                fmt.Println(name"B do something"

            } 

        } 

     

    func main() { 

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

        go foo(ctx, "FooBar"

        fmt.Println("client release connection, need to notify A, B exit"

        time.Sleep(5 * time.Second

    (责任编辑:admin)