目錄參考
併發在圖中的解釋是兩隊人排隊接咖啡,兩隊切換。
並行是兩個咖啡機,兩隊人同時接咖啡goroutine
啟動goroutine只要在前面呼叫函式前加go關鍵字即可
乙個goroutine必定對應乙個函式,可以建立多個goroutine執行相同的函式
通過runtime.gomaxprocs(n)
函式設定當前程式併發時占用的cpu邏輯核心數
併發安全和鎖package main
import (
"fmt"
"sync"
"time"
)func worker(id int, wg *sync.waitgroup)
func dosomething(doonce *sync.once))
fmt.println("run this every time")
}// safecounter 的併發使用是安全的。
type safecounter struct
// inc 增加給定 key 的計數器的值。
func (c *safecounter) inc(key string)
// value 返回給定 key 的計數器的當前值。
func (c *safecounter) value(key string) int
func main()
wg.wait()
// sync.once控制函式只能被呼叫一次,不能多次重複呼叫
var doonce sync.once
dosomething(&doonce)
dosomething(&doonce)
// 互斥鎖 mutex
// 讀寫鎖 rwmutex 讀鎖會阻止寫但不會阻止讀 rlock() runlock()釋放
// 寫鎖就等同於mutex
c := safecounter
for i := 0; i < 1000; i++
time.sleep(time.second)
fmt.println(c.value("somekey"))
// 條件變數 cond
// 可以讓一系列的 goroutine 都在滿足特定條件時被喚醒
原子操作
原子操作由內建的標準庫sync/atomic
提供
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)var x int64
var l sync.mutex
var wg sync.waitgroup
// 普通版加函式
func add()
// 互斥鎖版加函式
func mutexadd()
// 原子操作版加函式
func atomicadd()
func main()
wg.wait()
end := time.now()
fmt.println("原子操作版add函式 x=", x)
fmt.println("原子操作版add函式", end.sub(start))
channel通道
channel 是一種引用型別
var 變數 chan 元素型別
分類無緩衝的channel
傳送與接受同時進行。如果沒有goroutine讀取channel(
有緩衝的channel
傳送與接受並非同時進行。當隊列為空,接受者阻塞;佇列滿,傳送者阻塞。
worker pool(goroutine池)指定啟動的goroutine數量–worker pool模式,控制goroutine的數量,防止goroutine洩漏和暴漲。
select多路復用使用select提高**可讀性
併發程式設計.md
python學習打卡 Task1
基礎知識 注釋模組 內建函式dir 及help pep8 在mac終端輸入python可進入cpython互動式直譯器,利用print函式向世界打招呼吧 print hello,world 執行結果 hello,world input函式用於接收使用者輸入,先將輸入儲存在變數中,然後列印這個變數 d...
python基礎 打卡task1
a 1type a b float a b 1.0 type b c 1.5type c d int c d 1 type d 2 整型 布林型 a 0type a b bool a type b c flase type c d int c type d 3 浮點型 布林型 a 1.5type a...
程式設計TASK1
1.實現可以動態擴容的陣列 思路 新建陣列的時候,將陣列的容量大小設定為乙個變數,如果陣列容量不夠的時候,可以將原來資料擴大原來的幾倍,進行擴容 也可以直接使用c 中的vector容器,不必考慮原陣列的大小,如果需要增加元素,直接v.pushback 即可 2.將兩個有序陣列合併成乙個有序陣列 思路...