Go channel的使用場景與注意項

2021-10-25 22:26:38 字數 4177 閱讀 6649

經常會有這樣的場景,當資訊收集完成,通知下游開始計算資料:

import

("log"

"time"

)func

main()

)gofunc()

()calculatemsg()

}// 採集

func

collectmsg

(isover chan

struct)}

// 計算

func

calculatemsg()

程式輸出:

2021/01

/2509:

48:23 開始採集

2021/01

/2509:

48:26 完成採集

2021/01

/2509:

48:26 開始進行資料分析

如果只是單純的使用通知操作,那麼型別就使用 struct{}。因為空結構體在 go 中是不占用記憶體空間的,不信你看。

func

main()

fmt.

println

("占用空間:"

, unsafe.

sizeof

(res)

)}

程式輸出:

占用空間:

0

在做任務處理的時候,並不能保證任務的處理時間,通常會加上一些超時控制做異常的處理。

func

main()

}func

dowork()

chan

struct)go

func()

}()return ch

}

程式輸出:

2021/01

/2509:

58:10 開始處理任務

2021/01

/2509:

58:11 任務處理超時

生產者只需要關注生產,而不用去理會消費者的消費行為,更不用關心消費者是否執行完畢。而消費者只關心消費任務,而不需要關注如何生產。

func

main()

// 乙個生產者

func

producer

(ch chan

int)

close

(ch)

// 關閉通道

}// 消費者

func

consumer

(ch chan

int)

fmt.

printf

("消費者:%d,消費了:%d\n"

, id, item)

time.

sleep(50

* time.millisecond)

// 給別人一點機會不會吃虧}}

(i)}

}

程式輸出:

消費者:

4,消費了:

0消費者:

0,消費了:

1消費者:

1,消費了:

2消費者:

2,消費了:

3消費者:

3,消費了:

4消費者:

3,消費了:

6消費者:

1,消費了:

8消費者:

2,消費了:

7消費者:

0,消費了:

5消費者:

4,消費了:

9

極客上一道有意思的題,假設有4個 goroutine,編號為1,2,3,4。每3秒鐘會有乙個 goroutine 列印出它自己的編號。現在讓你寫乙個程式,要求輸出的編號總是按照1,2,3,4這樣的順序列印。類似下圖:

// 4 個 協程

for j :=

0; j < num; j++

// 先把令牌交給第乙個

chs[0]

struct

select

}func

worker

(id int

, currentch chan token, nextch chan token)

}程式輸出:

123

4123

4...

經常會寫一些指令碼,在凌晨的時候對內或者對外拉取資料,但是如果不對併發請求加以控制,往往會導致 groutine 氾濫,進而打滿 cpu 資源。往往不能控制的東西意味著不好的事情將要發生。對於我們來說,可以通過 channel 來控制併發數。

func

main()

,10) jobcount :=

100for i :=

0; i < jobcount; i++

job(index)

}(i)

} time.

sleep(30

* time.second)

}func

job(index int

)

上述**控制了任意時刻只有10和協程在同時執行

當然了,sync.waitgroup 也可以實現併發協程數控制:

func

main()

for j := index; j < i; j++

(j)}

wg.wait()

fmt.

println

("------------")}

}func

job(index int

)

可以通過 channel 實現乙個小小的互斥鎖。通過設定乙個緩衝區為1的通道,如果成功地往通道傳送資料,說明拿到鎖,否則鎖被別人拿了,等待他人解鎖。

type ticket struct

type mutex struct

// 建立乙個緩衝區為1的通道作

func

newmutex()

*mutex

}// 誰能往緩衝區為1的通道放入資料,誰就獲取了鎖

func

(m *mutex)

lock()

}// 解鎖就把資料取出

func

(m *mutex)

unlock()

}func

main()

()gofunc()

()time.

sleep

(500

* time.millisecond)

// 用了一點小手段這裡最後才能拿到鎖

Git使用場景 命令使用場景

通過個人使用git時候的遇到的使用場景,熟悉了解相關命令,也記錄一下場景的使用方法。所有場景均在ubuntu16.04 linux 作業系統下,其他作業系統有差異的地方自行查閱相關資料。安裝git sudo apt get install git設定及檢視git配置 user.name和user.e...

mongodb 使用場景和不使用場景

1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及json形式的資料。b.動態查詢 mongo支援豐富的查詢表達方式,查詢指令使用json形式的標記,...

mongodb 使用場景和不使用場景

mongodb 使用場景和不使用場景 2012 09 26 10 30 18 分類 linux 1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及js...