golang語言漸入佳境[20]-協程與通道
阿新 • • 發佈:2018-12-06
協程引入
通過狀態檢查器checkLink,不斷的獲取切片當中的網址,並且列印了出來。
順序執行。這也就意味著,一旦我訪問google.com等網站就會陷入到等待的狀況中。後面的網址無法訪問。
1 |
package main |
go的協程
在函式的前方,加入go
關鍵字,代表開闢一個新的協程。
執行一個go語言的程式的時候,都會開闢一個main協程。子協程通過go的關鍵字來建立。
通過Go的排程器,會將go的協程分配給CPU core取執行。當某一個子協程陷入了暫停或結束,Go的排程器會立即切換到其他的協程工作。因此大大的提高了效率。
但是當前的程式,直接退出了。因為main協程終止以後,子協程全部都會被銷燬。
1 |
package main |
channel通道
通道就是實現協程之間的通訊。
通道的建立
c:= make(chan string) 代表建立了一個通道,此通道只能夠傳遞字串型別。
通道例項
1 |
package main |
執行結果
1 |
http://www.baidu.com 連線上了 |
上面的程式碼輸出的結果為:
意味著百度連線上之後就退出了。這是由於主協程fmt.Println(<-c)陷入等待,當百度的子協程執行完畢,為通道新增資訊之後。那麼主協程退出,但是其他的協程還沒有執行完畢。但是會直接銷燬。
通道等待
如果想要全部打印出來,增加了多個等待通道的指令。
1 |
package main |
執行結果
1 |
http://www.baidu.com 連線上了 |
並不是順序執行的。
通道無限迴圈
1 |
package main |