golang學習筆記之併發優化(二)

2021-07-31 10:18:10 字數 2495 閱讀 2951

通往管道的資料如果一次打包傳送的效能要高於多次傳送。請看下面裡面,這個裡面我往管道裡面傳送50000000次

func main() 

close(done)

}()for i :=0 ;i<50000000;i++

close(c)

<- done

}

結果如下:

time go run mutilsend.go

1249999975000000

real 0m4.705s

user 0m6.666s

sys 0m1.319s

而當我使用陣列打包傳送,如下:

package main

func main()

gofunc()

}println(count)

close(done)

}()for i :=0 ;i<50000000;i++else

}close(c)

<- done

}

結果是:

time go run mutilsend.go

1249999975000000

real 0m0.209s

user 0m0.244s

sys 0m0.053s

效率得到了很大的提公升。建議搭建在資料量比較大的時候打包傳送資料。

無論是哪種程式語言,鎖物件一定得是公用的,所以的協程是應為共享同乙個鎖而導致阻塞的,這一點非常重要,下面演示結構體裡面使用鎖,直接使用會產生鎖複製

import (

"sync"

"time"

)type person struct

func (p person) test(act string)

}func main() ()

gofunc() ()

wg.wait()

}

結果如下:

write 1

read 1

read 2

write 2

write 3

read 3

read 4

write 4

read 5

write 5

write 6

read 6

write 7

read 7

read 8

write 8

write 9

read 9

在write的方法沒有釋放之前,read就使用了這個test,test這個應該函式是不能被其它地方使用的,這裡面問題就在鎖複製,如何解決這個問題呢,很簡單,指標應用

package main

import (

"sync"

"time"

)type person struct

func (p *person) test(act string)

}func main() ()

gofunc() ()

wg.wait()

}

這個裡面通過指標的方式避免lock 複製,大家共享同乙個鎖,看結果

write 1

write 2

write 3

write 4

write 5

write 6

write 7

write 8

write 9

read 1

read 2

read 3

read 4

read 5

read 6

read 7

read 8

read 9

我再上面每次列印睡眠是為了掩飾效果,如果不睡眠,很快執行完畢,很難看到效果。

在加鎖的時候請保持乙個原則,最小的鎖粒度,在能控制的情況下,盡早的釋放鎖。

譬如上面的例子

func (p *person) test(act string)  

}

這裡的defer是對整個函式加鎖,如果這裡設計到多個操作,都在鎖範圍,如果這裡多個操作,有的並不需要加鎖,可以減少,如

func (p *person) test(act string)
上面的請求就沒必要加鎖,這個在多個呼叫的時候可以減少等待時間。

死鎖簡單的說就是:你等我,我等你。在golang裡面重複的加鎖也會導致死鎖,看下面例子:

package main

import

"sync"

func main()

結果如下:

start

fatal error: all goroutines are asleep - deadlock!

死鎖了!

Golang 併發之互斥鎖

當多個goroutine同時訪問乙個資源的時候需要加上互斥鎖防止出錯。互斥鎖能保證同時只有乙個goroutine訪問共享資源。go語言中使用sync包的mutex型別詩選互斥鎖。go語言中對 mutex 的定義 a mutex is a mutual exclusion lock.the zero ...

golang學習筆記之 context詳細理解篇

17 27 52 上班 17 27 54 上班 17 27 56 上班 17 27 58 上班 17 28 00 上班 17 28 02 下班 17 28 02 無腦發呆中 package main import context log os time var logg log.logger fun...

學習筆記 Golang起步之HelloWord

進入官網 以mac終端為 zsh為例,輸入下面命令 vi zshrc在最後追加下面 users quaint study golang study 為你的golang 工作空間,該空間下應該包含3個資料夾 src pkg bin root 為go安裝目錄 path 為go工作空間 export go...