複製請求程式正在處理 使用者的http請求, 或者檢索乙個資料塊。你可以將請求分發到多個處理程式(無論是 goroutine ,程序, 還是伺服器),其中乙個將比其他
處理程式返回更快,可以 立即返回結果。
下面例子 在 單個程序中, 使用多個goroutine 作為處理程式。
goroutine 將隨機休眠一段時間以模擬不同的負載,
func main() , id int, wg *sync.waitgroup, result chan <- int)
select
took := time.since(started)
//顯示處理程式需要多長時間
if took < simulatedloadtime
fmt.printf("%v took %v\n", id, took)
} done := make(chan inte***ce{})
result := make(chan int)
var wg sync.waitgroup
wg.add(10)
for i := 0; i<10; i++
firstreturned := <- result
close(done)
wg.wait()
fmt.printf("received an answer from #%v\n", firstreturned)
}//6 took 1.002598933s
//0 took 1.002687636s
//9 took 2s
//2 took 5s
//3 took 1.002655195s
//4 took 3s
//5 took 2s
//1 took 3s
//8 took 4s
//7 took 2s
//received an answer from #6
所有的處理程式 都應該是盡可能 等價的,有相同的機會處理請求。建立和維護這樣一套系統 有很大的代價, 但如果你追求的是響應速度, 那是一種非常有價值的架構。這種方式天然提供了容錯 和 可擴充套件性。
Go 設計模式 策略模式
策略模式定義了演算法家族,在呼叫演算法家族的時候不感知演算法的變化,客戶也不會受到影響。下面用 大話設計模式 中的乙個例項進行改寫。例 超市中經常進行 活動,活動的 方法就是乙個個策略,如 滿一百減20 打八折 等。現在實現策略模式,用cashcontext生產策略,並完成策略的呼叫。1.首先定義所...
Go併發模式之 約束
約束 在編寫併發 的時候,有以下幾種不同的保證操作安全的方法。1。用於共享記憶體的同步原語 如sync.mutex 2.通過通訊來 共享記憶體來進行同步 如 channel 在併發處理中還有其他幾種情況也是隱式併發安全的 3。不會發生改變的資料 4。受到保護的資料 約束 特定約束,和 詞法約束 特定...
GO設計模式3 策略模式
所謂策略其實就是做一件事情有很多很多的方法,比如說乙個商場要搞 的方式有可能有很多 打折啊,滿100返50啊 積分等等之類的。這種不同的 方式在我們系統中表示就是乙個乙個的策略,並且策略是可以隨時更換的,這個時候在設計系統時就可以使用策略模式。type strategy inte ce策略一 typ...