zoukankan      html  css  js  c++  java
  • 采用最快回应

    通道用例大全 - Go语言101(通俗版Go白皮书) https://gfw.go101.org/article/channel-use-cases.html

    采用最快回应

    本用例可以看作是上例中只使用一个通道变种的增强。

    有时候,一份数据可能同时从多个数据源获取。这些数据源将返回相同的数据。 因为各种因素,这些数据源的回应速度参差不一,甚至某个特定数据源的多次回应速度之间也可能相差很大。 同时从多个数据源获取一份相同的数据可以有效保障低延迟。我们只需采用最快的回应并舍弃其它较慢回应。

    注意:如果有N个数据源,为了防止被舍弃的回应对应的协程永久阻塞,则传输数据用的通道必须为一个容量至少为N-1的缓冲通道。

    package main
    
    import (
    	"fmt"
    	"time"
    	"math/rand"
    )
    
    func source(c chan<- int32) {
    	ra, rb := rand.Int31(), rand.Intn(3) + 1
    	// 睡眠1秒/2秒/3秒
    	time.Sleep(time.Duration(rb) * time.Second)
    	c <- ra
    }
    
    func main() {
    	rand.Seed(time.Now().UnixNano())
    
    	startTime := time.Now()
    	c := make(chan int32, 5) // 必须用一个缓冲通道
    	for i := 0; i < cap(c); i++ {
    		go source(c)
    	}
    	rnd := <- c // 只有第一个回应被使用了
    	fmt.Println(time.Since(startTime))
    	fmt.Println(rnd)
    }
    

    “采用最快回应”用例还有一些其它实现方式,本文后面将会谈及。

    采用最快回应

    本用例可以看作是上例中只使用一个通道变种的增强。

    有时候,一份数据可能同时从多个数据源获取。这些数据源将返回相同的数据。 因为各种因素,这些数据源的回应速度参差不一,甚至某个特定数据源的多次回应速度之间也可能相差很大。 同时从多个数据源获取一份相同的数据可以有效保障低延迟。我们只需采用最快的回应并舍弃其它较慢回应。

    注意:如果有N个数据源,为了防止被舍弃的回应对应的协程永久阻塞,则传输数据用的通道必须为一个容量至少为N-1的缓冲通道。

    package main
    
    import (
    	"fmt"
    	"time"
    	"math/rand"
    )
    
    func source(c chan<- int32) {
    	ra, rb := rand.Int31(), rand.Intn(3) + 1
    	// 睡眠1秒/2秒/3秒
    	time.Sleep(time.Duration(rb) * time.Second)
    	c <- ra
    }
    
    func main() {
    	rand.Seed(time.Now().UnixNano())
    
    	startTime := time.Now()
    	c := make(chan int32, 5) // 必须用一个缓冲通道
    	for i := 0; i < cap(c); i++ {
    		go source(c)
    	}
    	rnd := <- c // 只有第一个回应被使用了
    	fmt.Println(time.Since(startTime))
    	fmt.Println(rnd)
    }
    

    “采用最快回应”用例还有一些其它实现方式,本文后面将会谈及。

  • 相关阅读:
    7、8月刷题总结
    【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
    [LeetCode] 459. Repeated Substring Pattern 重复子字符串模式
    [LeetCode] 268. Missing Number 缺失的数字
    [LeetCode] 190. Reverse Bits 翻转二进制位
    [LeetCode] 275. H-Index II H指数 II
    [LeetCode] 274. H-Index H指数
    [LeetCode] 387. First Unique Character in a String 字符串的第一个唯一字符
    [LeetCode] 415. Add Strings 字符串相加
    [LeetCode] 220. Contains Duplicate III 包含重复元素 III
  • 原文地址:https://www.cnblogs.com/rsapaper/p/15691177.html
Copyright © 2011-2022 走看看