go语言设计模式之Concurrency barrier
2024-08-30 10:29:37
barrier.go
package barrier import ( "fmt" "io/ioutil" "net/http" "time" ) var timeoutMillseconds int = 5000 type barrierResp struct { Err error Resp string } func barrier(endpoints ...string) { requestNumber := len(endpoints) in := make(chan barrierResp, requestNumber) defer close(in) responses := make([]barrierResp, requestNumber) for _, endpoint := range endpoints { go makeRequest(in, endpoint) } var hasError bool for i := 0; i < requestNumber; i++ { resp := <-in if resp.Err != nil { fmt.Println("ERROR: ", resp.Err) hasError = true } responses[i] = resp } if !hasError { for _, resp := range responses { fmt.Println(resp.Resp) } } } func makeRequest(out chan<- barrierResp, url string) { res := barrierResp{} client := http.Client{ Timeout: time.Duration(time.Duration(timeoutMillseconds) * time.Microsecond), } resp, err := client.Get(url) if err != nil { res.Err = err out <- res return } byt, err := ioutil.ReadAll(resp.Body) if err != nil { res.Err = err out <- res return } res.Resp = string(byt) out <- res }
barrier_test.go
package barrier import ( "bytes" "io" "os" "strings" "testing" ) func TestBarrier(t *testing.T) { t.Run("Correct endpoints", func(t *testing.T) { endpoints := []string{"https://www.baidu.com/", "https://www.sina.com.cn/"} result := captureBarrierOutput(endpoints...) if !strings.Contains(result, "Accept-Encoding") { t.Fail() } t.Log(result) }) t.Run("One endpoints incorrect", func(t *testing.T) { endpoints := []string{"http://malformed-url", "http://httpbin.org/User-Agent"} result := captureBarrierOutput(endpoints...) if !strings.Contains(result, "ERROR") { t.Fail() } t.Log(result) }) t.Run("Very short timeout", func(t *testing.T) { endpoints := []string{"http://httpbin.org/headers", "http://httpbin.org/User-Agent"} //timeoutMilliseconds := 1 result := captureBarrierOutput(endpoints...) if !strings.Contains(result, "Timeout") { t.Fail() } t.Log(result) }) } func captureBarrierOutput(endpoints ...string) string { reader, writer, _ := os.Pipe() os.Stdout = writer out := make(chan string) go func() { var buf bytes.Buffer io.Copy(&buf, reader) out <- buf.String() }() barrier(endpoints...) writer.Close() temp := <-out return temp }
最新文章
- 我的js函数库(持续更新)
- 基于highcharts封装的组件-demo&;源码
- MyEclipse2015配置Tomcat方法----》myeclipse2015
- C#有关日期的使用方法
- oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题
- Javascript 笔记与总结(2-7)对象
- jetbrains公司全系列软件最简单破解教程
- find your present
- Jquery 获得服务器控件值的方法小结(转)
- dbg调试
- Java基础——运算符
- Codefoces 723B Text Document Analysis
- ES ik分词器使用技巧
- [PA2014]Bazarek
- 设计模式学习心得<;工厂方法 Factory Method>;
- 个人阅读作业 --软件工程M1/M2总结
- putty登陆sourceforge.net(设置登录)
- HTML 基础 块级元素与行内元素
- TKmath Package gp数据类型
- 51nod1709复杂度分析
热门文章
- 【zabbix告警监控】配置zabbix监控nginx服务
- CSS(3)---块级标签、行内标签、行内块标签
- SQL server 2014 安装
- Windows CLI命令
- JS查找某个字符在字符串中出现的位置及次数
- SVN异常,Previous operation has not finished; run &#39;cleanup&#39; if it was interrupted
- C#实现将图片设置成圆形形式显示
- 发送RCS成功的消息log_1
- 51-overlay 是如何隔离的?
- Python 的字符编码