go語言中的併發

2021-09-08 04:39:58 字數 1617 閱讀 1015

package main;

import (

"fmt"

"runtime"

"sync"

)//goruntine奉行通過通訊來共享記憶體,而不是共享記憶體來通訊

//channel是goruntine溝通的橋梁,大都是阻塞同步的

//通過make建立,close關閉

//channel是引用型別

//使用for range來迭代操作channel

//可設定單向或雙向通道

//可設定快取大小,在未被填滿前不會發生阻塞

func main() ();

//這裡是阻塞的,等到匿名函式執行完成,給ch設定為true時

//這裡能讀取出資料時,就退出。

<-ch;

ch1 := make(chan bool);

go func() ();

//對chan進行迭代操作時,必須在某個地方關閉該chan,不然會發生死鎖

for v := range ch1

//有快取是非同步的

ch2 := make(chan bool, 1);

go func() ();

ch2 <- true;

//使用多核

runtime.gomaxprocs(runtime.numcpu());

ch3 := make(chan bool, 10);

for i := 0; i < 10; i++

//這裡讀取10次,跟上面go run()執行次數相同

//保證10次執行都執行完,才退出

for i:= 0; i < 10; i++

//這裡建立任務

wg := sync.waitgroup{};

wg.add(10);

for i := 0; i < 10; i++

//等待所有任務完成

wg.wait();

//有多個chan時,如何處理

ch4, ch5 := make(chan int), make(chan string);

//用於判斷是否關閉

ch6 := make(chan bool);

go func()

fmt.println(v);

case v, ok := <-ch5:

if !ok

fmt.println(v);

}} }();

ch4 <- 1;

ch4 <- 2;

ch5 <- "hello";

ch5 <- "world";

close(ch4);

close(ch5);

//迴圈讀取二次

for i := 0; i < 2; i++

}func run(ch chan bool, ix int)

fmt.println(ix, a);

//給chan傳遞true,說明該run執行結束

ch <- true;

}func run2(wg *sync.waitgroup, ix int)

fmt.println(ix, a);

//任務完成

wg.done();

}

在 Go 語言中,正確的使用併發

glyph lefkowitz最近寫了一篇 啟蒙文章 其中他詳細的說明了一些關於開發高併發軟體的挑戰,如果你開發軟體但是沒有閱讀這篇問題,那麼我建議你閱讀一篇。這是一篇非常好的文章,現代軟體工程應該擁有的豐富智慧型。從多個花絮中提取,但是如果我斗膽提出主要觀點的總結,其內容就是 搶占式多工和一般共享...

Go語言併發

協程 本質上是一種使用者態執行緒,不需要作業系統來進行搶占式排程,且在真正的實現重寄存於執行緒中,因此,系統開銷極小,可以有效提高執行緒的任務併發性,從而避免多執行緒的缺點。使用協程的優點是程式設計簡單,結構清晰 缺點是需要語言的支援。協程最大優勢 輕量級 可以輕鬆建立上百萬個而不會導致系統資源衰竭...

go 語言中的繼承

go 語言中可以通過匿名field來實現繼承的效果,type t1 struct func t t1 log func t t1 print type t2 struct t2 t2 可以通過t2.log 直接訪問t1的method,就像物件導向的繼承之後一樣訪問,不過這裡要注意的傳遞到log的是t...