go例子(三) 使用context实现发牌手策略
使用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
}
}
}
go例子(三) 使用context实现发牌手策略的更多相关文章
- Flask备注三(Context)
Flask备注三(Context) Flask支持不同的应用场景下,对应不同的local context(本地上下文环境),用来提供当前环境下的资源.lcoal context和全局变量以及局部变量最 ...
- [转]三分钟学会.NET Core Jwt 策略授权认证
[转]三分钟学会.NET Core Jwt 策略授权认证 一.前言# 大家好我又回来了,前几天讲过一个关于Jwt的身份验证最简单的案例,但是功能还是不够强大,不适用于真正的项目,是的,在真正面对复杂而 ...
- Android深入理解Context(三)Context完全解析
1· Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是 ...
- scrapy-splash抓取动态数据例子三
一.介绍 本例子用scrapy-splash抓取今日头条网站给定关键字抓取咨询信息. 给定关键字:打通:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信 ...
- 创建dynamics CRM client-side (三) - Execution Context
Execution Context 在代码执行的时候定义了event context. 当form或者grid发生event时候传递了execution context. 可以在event hand ...
- 从零开始学习Node.js例子三 图片上传和显示
index.js var server = require("./server"); var router = require("./router"); var ...
- Java多线程小例子(三个窗口卖火车票)
class Ticket implements Runnable{ private int TicketNum = 100; //100张火车票 private boolean flag = true ...
- python例子三
例一:匹配长度为1-15的域名 #-*-encoding:utf--*- import re regex=re.compile('^www[.][a-z]{1,15}[.](com|org)') m1 ...
- 关于TCP传输的三次握手四次挥手策略
简单小总结: 一般为了能够准确无误地把数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达. 注:握手过程中使用 ...
随机推荐
- 3DSMAX安装失败,如何卸载修复重新安装3dmax 2017?
一些同学安装3dmax出错了,也有时候想重新安装3dmax的时候会出现这种本电脑已安装3dmax,你要是不留意直接安装,只会按装3dmax的附件,3dmax是不会按装上的.这种原因呢就是大家在之前卸载 ...
- Redis 事物、悲观、乐观锁 (详细)
1,概论 事物这东西相信大家都不陌生吧,在学习Spring,Mybatis等框架中, 只要是涉及到数据存储和修改的,都会有事物的存在, 废话就不多说了下面我们来简单的介绍下Redis事物以及锁. 2, ...
- Esp8266和HomeKit
Summary 没有找到合适的简单解决方案,将Esp8266控制的设备连接到HomeKit.所以参照EspEasy实现 HomeKit和Esp8266连接. 连接方式: Raspberry Zero ...
- Mybatis--Statement Builders
SelectBuilder 的秘密 SelectBuilder 类并不神奇, 如果你不了解它的工作机制也不会有什么好的作用. 别犹豫, 让我们来看看它是怎么工作的. SelectBuilder 使用了 ...
- 【转】Android Monkey 命令行可用的全部选项
常规 事件 约束限制 调试 原文参见:http://www.douban.com/note/257030384/ 常规 –help 列出简单的用法. -v 命令行的每一个 -v 将增加反馈信息的级别. ...
- Python 破解极验滑动验证码
Python 破解极验滑动验证码 测试开发社区 1周前 阅读目录 极验滑动验证码 实现 位移移动需要的基础知识 对比两张图片,找出缺口 获得图片 按照位移移动 详细代码 回到顶部 极验滑动验证码 以 ...
- OPPO招聘-互联网测试
邮 箱:ljy@oppo.com 工作地点:深圳
- AndroidStudio自动导入包
IntelliJ IDEA可以自动优化导入包,但是有多个同名的类位于不同的包时,需要自己手动使用Alt + Enter进行导入. Settings→Editor→General→Auto Import ...
- 人心和隐私怎么防?“防出轨”APP让道德滑落
王尔德曾说过,"一个人应该永远保持一点神秘感".让·保·里克特也表示,:"一个人泄露了秘密,哪怕一丝一毫,就再也得不到安宁了".可见,对于自然人来说,保有自 ...
- css雪碧图压缩
cssgaga下载地址 链接: https://pan.baidu.com/s/1Q9xH_XzumIc7vTLCZ3tr5A 提取码: stqe CssGaga功能特性 合并import的CSS文件 ...