标签:context 搜索 返回结果 efault googl return txt ret ima
使用context包实现发牌手策略,
发牌手策略:罗永浩在介绍TNT工作站时描述,将一个任务分发给多个处理者处理,谁先处理完使用谁的结果,取消其他的处理者的任务。
经典的例子:同时在百度、google、微软必应搜索,任何一个返回结果,则取消其他的搜索请求
以下代码实现在喜马拉雅、QQ音乐、网易云音乐搜索歌曲
package main import ( "context" "fmt" "io/ioutil" "net/http" ) var wangYiYunYinYue = "https://music.163.com/#/search/m/?s=%s&type=1" var qqMusic = "https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%s" var xiMaLaYa = "https://www.ximalaya.com/search/%s" func main() { ctx, cancel := context.WithCancel(context.Background()) ret := make(chan string) go findMusic(ctx, fmt.Sprintf(wangYiYunYinYue, "铁血丹心"), ret) go findMusic(ctx, fmt.Sprintf(qqMusic, "铁血丹心"), ret) go findMusic(ctx, fmt.Sprintf(xiMaLaYa, "铁血丹心"), ret) select { case r := <-ret: fmt.Println("r:", r) cancel() } } func findMusic(ctx context.Context, url string, ret chan<- string) { for { select { case <-ctx.Done(): fmt.Println("dowork done") return default: resp, err := http.Get(url) if err != nil { fmt.Println(err) return } b, _ := ioutil.ReadAll(resp.Body) ret <- string(b) return } } }
标签:context 搜索 返回结果 efault googl return txt ret ima
原文地址:https://www.cnblogs.com/Bin-DuS/p/12527155.html