通道channel
併發(concurrency):邏輯上具備同時處理多個任務的能力。
並行(parallesim)不同於併發,物理上的同一時刻,相當於併發設計的理想執行模式。
在函式呼叫前新增go關鍵字即可建立併發任務
輸出:a :=
100go
func
(x, y int
)(a,
counter()
)a = a +
66println
("main:"
,a,counter()
)
main: 166 2
go: 100 1
等待併發任務結束
1.通道channel
2.sync.waitgroup
設定計數器,讓goroutine在退出前遞減,在歸零時解除阻塞。
gomaxprocs
修改執行時的執行緒數量
runtime.gomaxprocs(),引數<1時,返回當前設定值,不作調整
實現local storage
goroutine沒有區域性儲存,無法獲取編號,返回值也會被拋棄,需自己寫方法實現
不適用waitgroup時:
輸出為://var wg sync.waitgroup
var gs [5]
struct
for i :=
0;i <
len(gs)
;i++
(i)}
fmt.
printf
("%+v\n"
,gs)
程式併發,未等到多個任務結束時就退出程序
goexitvar wg sync.waitgroup
var gs [5]
struct
for i :=
0;i <
len(gs)
;i++
(i)}
wg.wait()
fmt.
printf
("%+v\n"
,gs)
}
goexit立即終止當前任務;
不會影響其他併發任務,不會引發panic。
在main.main中呼叫goexit,他會等待其他任務結束,然後讓程序直接崩潰。
(聽起來很任性hhh)
底層看來,通道相當於乙個佇列。
同步模式:傳送和接收方配對,直接將資料賦值給對方;配對失敗時,進入等待佇列,知道另一方出現後喚醒。
必須有配對操作的goroutine出現,否則阻塞。
非同步模式:搶奪資料緩衝槽,傳送方需要寫入,接收方需要緩衝資料可讀。
非同步通道有助於提公升效能,減少排隊阻塞。
此外,通道還被用作事件通知。
通道變數本身就是指標可以判斷是否為同一物件或者nil。//訊號通知
done :=
make
(chan
struct
)//結束事件
//chan struct{}:不能被寫入任何資料,不占用任何記憶體。
//必須通過close進行關閉操作才能輸出
c :=
make
(chan
string
)//資料傳輸通道
gofunc()
()c
"hello!"
//傳送訊息
println
(c)//輸出位址?
//非同步
c1 :=
make
(chan
int,3)
//建立帶有3個緩衝槽的非同步通道
c1 1c1
2println
(println
(//println(
可用cap和len函式判斷同步/非同步,同步通道兩者都返回0.
cap:返回已緩衝數量
len:返回緩衝區大小
println
("c:"
,len
(c),
cap(c)
)println
("c1:"
,len
(c1)
,cap
(c1)
)
輸出:併發事件不保證輸出順序(?)var wg sync.waitgroup
ready :=
make
(chan
struct
)for i :=
0; i <
3;i++
(i)}
time.
sleep
(time.second)
println
("ready?go!"
)close
(ready)
//peng!
wg.wait
()

已關閉通道:
傳送資料->引發panic
接收資料->返回已緩衝資料或零值
nil通道:
收發都會阻塞
單向通道
使用型別轉換獲取單向通道,並分別賦予操作雙方
輸出結果://單向操作
var wg sync.waitgroup
wg.add(2
)//收 發,引數為2
c1way :=
make
(chan
int)
var send chan
int= c1way
var recv
chan
int= c1way
gofunc()
}()go
func()
}()wg.
wait()
//禁止逆向操作
////recv
//close(recv) //invalid operation: close(recv) (cannot close receive-only channel)
//單向不可逆
//c2ways := (chan int)(recv) //cannot convert recv (type
//c2ways = (chan int)(send) //cannot convert send (type chan

通道還可以實現訊號量機制
以及同步。
GO語言學習 併發
goroutine 由go執行環境管理的輕量級執行緒 channel 有型別的管道,操作符為 資料流向箭頭指向的方向 使用make chan 緩衝資料型別 緩衝區長度 來建立 使用close chan 來關閉管道,只有傳送者才允許關閉管道 例ch make chan int 10 ch 10 a c...
Go語言學習筆記 併發
區別 1.併發 邏輯上具備同時處理多個任務的能力,指的是多個任務在同一時間段執行而不是同一時刻 2.並行 物理上同一時刻執行多個任務 goroutine像乙個多執行緒和協程的綜合體,執行時會建立多個限制來執行併發任務,且任務單元可排程到其他執行緒並行執行,最大限度提公升執行效率。go println...
go語言學習備忘 併發
並行是讓不同的 片段同時在不同的物理處理器上執行。並行的關鍵是同時做很多事情,而併發是指同時管理很多事情,這些事情可能只做了一半就被暫停去做別的事情了。在很多情況下,併發的效果比並行好,因為作業系統和硬體的總資源一般很少,但能支援系統同時做很多事情。這種 使用較少的資源做更多的事情 的哲學,也是指導...