第11課 Go併發

2021-12-29 21:33:27 字數 1974 閱讀 1237

併發concurrency

很多人都是衝著go大肆宣揚的高併發而忍不住躍躍欲試,但其實從原始碼的解析來看,goroutine只是由官方實現的「執行緒池」而已。不過話說回來,每個例項4-5kb的棧記憶體占用和由於實現機制而大幅減少的建立和銷毀開銷,是製造go號稱高併發的根本原因。另外,goroutine的簡單易用,也在語言層面上給予了開發者巨大的便利。

併發不是並行:concurrency is not parallelism

併發主要有切換時間片來實現「同時」執行,在並行則是直接利用多核實現多執行緒的執行,但go可以設定使用核數,以發揮多核計算機的能力。

goroutine奉行通過通訊來共享記憶體,而不是共享記憶體來通訊。

/*乙個最最最最基本的goroutine*/

package main

import (

"fmt"

"time"

)func main()

func go() channel 是 goroutine溝通的橋梁,大都是阻塞同步的 通過make建立,close關閉 channel是引用型別 可以使用for range來迭代不斷操作channel 可以設定單項或雙向通道 可以設定快取大小,在被填滿前不會發生阻塞package main

import (

"fmt"

)func main() //當乙個核的時候還是按部就班的乙個執行緒乙個執行緒開始執行,可是現在變成多核以後,指不定先執行哪個後執行哪個,可能先執行i=5的,也可能先執行i=8的,即分配任務不定的特性

那麼如何解決這個問題呢?

解決方案1—-利用快取

package main

import (

"fmt"

"runtime"

)func main() //執行了10個執行緒

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

wg.add(10) //設定增加10個任務量

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

wg.wait() //在這裡要等待任務都完成

}func go(wg *sync.waitgroup, index int)

fmt.println(index, a)

wg.done() //標記一次done

}可處理乙個或多個channel的傳送與接收 同時又多個可用的channel的按隨機順序處理 可用空的select來阻塞main函式 可設定超時

select是go中的乙個控制結構,類似於用於通訊的switch語句。每個case必須是乙個通訊操作,要麼是傳送要麼是接收。

select隨機執行乙個可執行的case。如果沒有case可執行,它將阻塞,直到有case可執行。乙個預設的子句應該總是可執行的。

select 以下描述了 select 語句的語法:

每個case都必須是乙個通訊

所有channel表示式都會被求值

所有被傳送的表示式都會被求值

如果任意某個通訊可以進行,它就執行;其他被忽略。

如果有多個case都可以執行,select會隨機公平地選出乙個執行。其他不會執行。

否則: 1、如果有default子句,則執行該語句。

2、如果沒有default字句,select將阻塞,直到某個通訊可以執行;go不會重新對channel或值進行求值。例項

package main

import "fmt"

func main() {

var c1, c2, c3 chan int

var i1, i2 int

select {

case i1 =以上輸出結果如下:

no communication如何設定超時

//設定超時

package main

import (

"fmt"

"time"

)func main() {

c := make(chan bool)

select {

case v :=

第11課作業

第一題 三位數分解 include include 第11課作業 第一題 三位數分解,知識點 符號的使用 int main 第二題 分離浮點數的整數和小數部分 include include 第11課作業 第二題 分離整數和小數部分,知識點 不同資料型別的轉換,這裡只考慮小數點後有三位的情況 int...

第11課 邊框

邊框 border 可以有多種用途,比如作為裝飾元素或者作為劃分兩物的分界線。在設定邊框方面,css為你提供了無盡選擇。邊框寬度由css屬性border width定義,其值可以是 thin 薄 medium 普通 或 thick 厚 等,也可以是畫素值。如下圖所示 css屬性border colo...

第11課 Python字典

一.字典概述 1.字典的誕生 有時需要儲存具有對應關係的資料對,如使用者名稱和密碼,每個使用者名稱對應乙個密碼,這種資料用列表儲存比較麻煩,於是誕生了字典,其內部是很多值的無序集合,可以把乙個特定資料當做索引值進行索引。2.字典的格式 a 花括號 字典由左花括號開始,右花括號結束 鍵 字典中在冒號 ...