golang對比其它語言最大的優勢就是乙個go關鍵字就能實現併發,工作中經常遇到併發的場景, 具體實現併發的方式有多種,今天就來做個小實驗來對比說明序列和並行執行任務中併發的優勢,好了直接上**
package mainimport (
"fmt"
"math/rand"
"sync"
"time"
)//定義任務數量
var jobscount int = 10
func main()
//序列實現任務執行
func serial()
fmt.println("serial task done success ")
}//使用waitgroup 來實現等待併發完成
func parallel()
for i := 0; i < jobscount; i++ (i)
}wg.wait()
fmt.println("parallel task done success ")
}//使用chanel 來實現併發
func parallel2()
for i := 0; i < jobscount; i++
}//我是完成耗時工作的
func dotask(taskid int, ch chan int)
//測量函式執行時間
func timer(funcname string, f func())
這裡假設要完成十個耗時的任務,每個任務需要500ms或者隨機時間,分別用序列和兩個並行函式來完成;
序列執行的順序就是每個任務執行完才能執行下個任務,並行執行就是十個任務同時執行不分先後(可以認為同時開始),
使用計時器對每個函式執行時間進行度量,
main 啟動後,檢視控制台上結果的輸出:
hello task 0hello task 1
hello task 2
hello task 3
hello task 4
hello task 5
hello task 6
hello task 7
hello task 8
hello task 9
serial task done success
serial fun cost 5.0042001s
hello task 9
hello task 4
hello task 5
hello task 6
hello task 7
hello task 8
hello task 2
hello task 0
hello task 3
hello task 1
parallel task done success
parallel fun cost 500.0504ms
task 9 doing !!!!!!!!!!!!!
task 4 doing !!!!!!!!!!!!!
task 3 doing !!!!!!!!!!!!!
task 6 doing !!!!!!!!!!!!!
task 7 doing !!!!!!!!!!!!!
task 8 doing !!!!!!!!!!!!!
task 1 doing !!!!!!!!!!!!!
task 0 doing !!!!!!!!!!!!!
task 2 doing !!!!!!!!!!!!!
task 5 doing !!!!!!!!!!!!!
task 3 done
task 4 done
task 1 done
task 9 done
task 2 done
task 0 done
task 7 done
task 8 done
task 6 done
task 5 done
parallel2 fun cost 500.3297ms
process finished with exit code 0
從控制台上我們可以看到序列執行的話,每個任務500ms ,總任務執行了5s ,
並行執行的話,兩個並行並沒有順序,每個任務500ms,總任務也可以認為是500ms,
序列的**10行,並行的**分別為 15行和20行 ,相比之下時間上後者是前者的1/10,這就是並行的巨大優勢,因此我們要多審視自己的**,避免偷懶,面對高併發場景下才能實現高效完成任務;
新增迴圈中使用管道chanel的形式
//使用chan 接收等待任務完成(缺點:增加開銷)func paralle3() (i)
}for i := 0; i < jobscount; i++
fmt.println("paralle3 task done success ")
}
golang 併發 並行
go 語言的執行緒是併發機制,不是並行機制。那麼,什麼是併發,什麼是並行?併發是不同的 塊交替執行,也就是交替可以做不同的事情。並行是不同的 塊同時執行,也就是同時可以做不同的事情。舉個生活化場景的例子 你正在家看書,忽然 來了,然後你接 通話完成後繼續看書,這就是併發,看書和接 交替做。如果 來了...
併發 並行 序列
併發是同時處理 dealing 很多的事情 並行是同時做 doing 很多的事情 併發是在同一實體上的多個事件 並行是在不同實體上的多個事件 併發處理都有排隊等候,喚醒,執行至少三個這樣的步驟.所以併發肯定是巨集觀概念,在微觀上他們都是序列被處理的,只不過資源不會在某乙個上被阻塞 一般是通過時間片輪...
序列,併發,並行。
序列 serial 並行 parallel 併發 concurrent 並行,序列與併發的區別 假如有個橋。假設1 這個橋比較脆弱,只能承受乙個人的重量,而橋的旁邊有個休息區則不限重量,走累了可以隨時停下來往右一靠,把橋讓出給別人。那麼兩個人a和b要同時過橋就應該 a先走,b看到a走累了到休息區的時...