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

2022-04-27 19:24:12 浏览数 (1)

使用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
		}
	}
}

0 人点赞