GO程式設計(打卡) Task13 併發程式設計

2022-07-10 15:51:10 字數 2605 閱讀 4012

目錄參考

併發在圖中的解釋是兩隊人排隊接咖啡,兩隊切換。

並行是兩個咖啡機,兩隊人同時接咖啡

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.將兩個有序陣列合併成乙個有序陣列 思路...