《日子》golang-并發(fā)concurrency

并發(fā)concurrency

-很多人都是沖著Go 大肆宣揚(yáng)的高并發(fā)而忍不住躍躍欲試,但其實(shí)從源碼的解析來看,goroutine只是由官方實(shí)現(xiàn)的超級"線程池"而已。不過話說回來,每個實(shí)例4-5KB的棧內(nèi)存占用和由于實(shí)現(xiàn)機(jī)制而大幅減少的創(chuàng)建和銷毀開銷,是制造Go號稱的高并發(fā)的根本原因。另外,goroutine的簡單易用,也在語言層面上給予了開發(fā)者巨大的便利。

并發(fā)不是并行:Concurrency Is Not Parallelism
-并發(fā)主要由切換時間片來實(shí)現(xiàn)"同時"運(yùn)行,在并行則是直接利用多核實(shí)現(xiàn)多線程的運(yùn)行,但Go可以設(shè)置使用核數(shù),以發(fā)揮多核計算機(jī)的能力。

Goroutine奉行通過通信來共享內(nèi)存,而不是共享內(nèi)存來通信。

Channel

-Channel 是 goroutine溝通的橋梁,大都是阻塞同步的
-通過make創(chuàng)建,close關(guān)閉
-Channel是引用類型
-可以使用for range來迭代不斷操作Channel
-可以設(shè)置單向或雙向通道
-可以設(shè)置緩存大小,在未補(bǔ)填滿前不會發(fā)生阻塞
(有緩存異步,無緩存同步)

Select

-可以處理一個或多個channel的發(fā)送與接收
-同時有多個可用的 channel時按隨機(jī)順序處理
-可用空的select來阻塞main函數(shù)
-可設(shè)置超時

<code>
package main
import (
"fmt"
)
func main() {
c := make(chan bool)
go func() {
fmt.Println("Go Go Go!!!")
c <- true
}()
<-c
}
</code>

并行示例1

<code>
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
c := make(chan bool, 10)
for i := 0; i < 10; i++ {
go Go(c, i)
}
for i := 0; i < 10; i++ {
<-c
}
}
func Go(c chan bool, index int) {
a := 1
for i := 0; i < 1000000000; i++ {
a += i
}
fmt.Println(index, a)
c <- true
}
</code>

并行示例2

<code>
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
wg := sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go Go(&wg, i)
}
wg.Wait()
}
func Go(wg *sync.WaitGroup, index int) {
a := 1
for i := 0; i < 1000000000; i++ {
a += i
}
fmt.Println(index, a)
wg.Done()
}
</code>

Select 示例

<code>
package main
import (
"fmt"
)
func main() {
c := make(chan int)
go func() {
for v := range c {
fmt.Println(v)
}
}()
for {
select {
case c <- 0:
case c <- 1:
}
}
}
</code>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容