标签:func url error result context time go 上下文
package main import ( "context" "fmt" "sync" "errors" "time" ) func Rpc(ctx context.Context, url string, isSuccess bool) error { result := make(chan int) err := make(chan error) if url == "http://rpc_2_url" { time.Sleep(time.Second * 5) } if url == "http://rpc_4_url" { time.Sleep(time.Second * 30) } go func() { // 进行RPC调用,并且返回是否成功,成功通过result传递成功信息,错误通过error传递错误信息 if isSuccess { result <- 1 } else { err <- errors.New("some error happen") } }() select { case <-ctx.Done(): // 其他RPC调用调用失败 fmt.Println("ctx.Done") return ctx.Err() case e := <-err: // 本RPC调用失败,返回错误信息 fmt.Println("err", url, e) return e case <-result: fmt.Println("result", url, result) // 本RPC调用成功,不返回错误信息 return nil } } func main() { ctx, cancel := context.WithCancel(context.Background()) //RPC1调用 err := Rpc(ctx, "http://rpc_1_url", true) if err != nil { fmt.Println("err11111", err) return } wg := sync.WaitGroup{} // RPC2调用 wg.Add(1) go func() { defer wg.Done() err := Rpc(ctx, "http://rpc_2_url", true) if err != nil { fmt.Println("err2", err) cancel() } }() // RPC3调用 wg.Add(1) go func() { defer wg.Done() err := Rpc(ctx, "http://rpc_3_url", false) if err != nil { fmt.Println("err3", err) cancel() } }() // RPC4调用 wg.Add(1) go func() { defer wg.Done() err := Rpc(ctx, "http://rpc_4_url", true) if err != nil { fmt.Println("err4", err) fmt.Println("RPC4 取消") cancel() } }() wg.Wait() }
标签:func,url,error,result,context,time,go,上下文 来源: https://www.cnblogs.com/zxqblogrecord/p/15545900.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。