下面的例子可以发现,用了一个 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)