并發(fā)循環(huán)
循環(huán)往往是性能上的熱點(diǎn)。如果性能瓶頸出現(xiàn)在CPU上的話,那么九成可能性熱點(diǎn)是在一個循環(huán)體內(nèi)部。所以如果能讓循環(huán)體并發(fā)執(zhí)行,那么性能就會提高很多。
要并發(fā)循環(huán)很簡單,只有在每個循環(huán)體內(nèi)部啟動協(xié)程。協(xié)程作為循環(huán)體可以并發(fā)執(zhí)行。調(diào)用啟動前設(shè)置一個計數(shù)器,每一個循環(huán)體執(zhí)行完畢就在計數(shù)器上加一個元素,調(diào)用完成后通過監(jiān)聽計數(shù)器等待循環(huán)協(xié)程全部完成。
//建立計數(shù)器
sem :=make(chan int, N);
//FOR循環(huán)體
for i,xi:= range data {
//建立協(xié)程
go func (i int, xi float) {
doSomething(i,xi);
//計數(shù)
sem <- 0;
} (i, xi);
}
// 等待循環(huán)結(jié)束
for i := 0; i < N; ++i { <-sem }
上面是一個并發(fā)循環(huán)例子。通過計數(shù)器來等待循環(huán)全部完成。如果結(jié)合上面提到的Future技術(shù)的話,則不必等待?梢缘鹊秸嬲枰慕Y(jié)果的地方,再去檢查數(shù)據(jù)是否完成。
通過并發(fā)循環(huán)可以提供性能,利用多核,解決CPU熱點(diǎn)。正因?yàn)閰f(xié)程可以大量創(chuàng)建,才能在循環(huán)體中如此使用,如果是使用線程的話,就需要引入線程池之類的東西,防止創(chuàng)建過多線程,而協(xié)程則簡單的多。