前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go例子(三) 使用context实现发牌手策略

go例子(三) 使用context实现发牌手策略

作者头像
杜争斌
发布2022-04-27 19:24:12
1770
发布2022-04-27 19:24:12
举报
文章被收录于专栏:我的博文我的博文

使用context包实现发牌手策略,

发牌手策略:罗永浩在介绍TNT工作站时描述,将一个任务分发给多个处理者处理,谁先处理完使用谁的结果,取消其他的处理者的任务。

经典的例子:同时在百度、google、微软必应搜索,任何一个返回结果,则取消其他的搜索请求

以下代码实现在喜马拉雅、QQ音乐、网易云音乐搜索歌曲

代码语言:javascript
复制
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
		}
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档