Go語言那些事兒之淺談協程并發競爭資源問題
Go語言那些事兒之淺談協程并發競爭資源問題
我們在實際操作過程中,往往會遇到擁有多條協程并發的情況,那么當多條協程并發時,協程之間是如何競爭有限的資源的呢?本文將介紹有關內容。
我們先看一看本文實例代碼的主函數,兩條子協程,主協程3秒后結束。
func main() { go fun1() go fun2() time.Sleep(3 * time.Second) }
再看看看兩條子協程分別是干些什么吧!
func fun1(){ //遍歷字符串的每一個字符 for _,c:=range "就像老鼠愛大米"{ //如果這里使用Println的話,輸出的會是字符在字符集中的編號。 //這里f是format也就是格式的意思。 fmt.Printf("%c\n",c) //runtime.Goexit() //每隔一納秒打印一個字。 time.Sleep(time.Nanosecond) } } func fun2(){ for _,c := range"ReganYue"{ fmt.Printf("%c\n",c) //runtime.Goexit() time.Sleep(time.Nanosecond) } }
fun1函數,是遍歷輸出"就像老鼠愛大米",值得注意的是,這里使用for…range循環遍歷字符串的話,不能使用fmt.Println,因為如果這里使用Println的話,輸出的會是字符在字符集中的編號。
而fmt.Printf 這里f是format也就是格式化的意思。
看看運行結果
R 就 像 e g 老 鼠 a n 愛 Y 大 米 u e
發現兩條協程運行的結果均勻分布。這就說明兩條協程公平競爭資源,兩條協程之間實力旗鼓相當。
可如果激活fun1內的runtime.Goexit()
那么輸出結果就是:
就 R e g a n Y u e
如果激活fun2內的runtime.Goexit()
那么輸出結果就是:
就 R 像 老 鼠 愛 大 米
因為Goexit殺掉它的 goroutine,其他 goroutine 也不會受到影響。所以當fun1的所在的子協程被殺死時,不會影響fun2所在的子協程的正常運行。
如果本段代碼中兩個runtime.Goexit()都激活,那么兩條協程都只會輸出一個字符。
就 R
因為兩條協程在輸出完一個字符后就被殺死了。
如果兩個及以上個協程在沒有同步的情形下去訪問共享的資源,并且嘗試同一時間讀和寫共享的資源。就會出現資源競爭問題。出現的這個問題能夠讓程序變得稍微復雜,本文就暫時不討論這些復雜情況,想知道的可以關注博主,博主后期會介紹。
我們也可以使用 go build 的 -race 參數,使用它可以了解是否存在資源競爭問題,關于 go build 的 -race 參數的使用,本篇博文暫不介紹,后期博主會盡量詳細介紹。
Go HTTP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。