Go百萬級別併發實踐

2021-10-04 02:38:34 字數 1456 閱讀 6300

golang和傳統基於 os 執行緒和程序實現不同,go語言的併發是基於使用者態的併發,這種併發方式就變得非常輕量,能夠輕鬆執行幾萬併發邏輯。

go 的併發屬於 csp 併發模型的一種實現,csp 併發模型的核心概念是:「不要通過共享記憶體來通訊,而應該通過通訊來共享記憶體」。這在 go 語言中的實現就是 goroutine 和 channel。

任務介面

// job介面 含乙個do方法,實現該介面,即為乙個請求任務

type job inte***ce

執行緒

// 工作執行緒結構,裡面是乙個管道,放多個請求任務

type worker struct

// 類似建構函式,返回乙個工作執行緒

func

newworker

() worker

}// 工作執行緒的成員函式,處理請求

// 形參wq是乙個工作佇列

// 呼叫之後,會起乙個執行緒,無限迴圈,取出任務,放到執行緒池中 ???

func

(w worker)

run(wq chan

chan job)}}

()}

執行緒池

// 執行緒池

// 執行緒數、任務佇列、裝任務佇列的管道

type workerpool struct

// 執行緒池的建構函式

func

newworkerpool

(workerlen int

)*workerpool

}// 執行緒池的成員函式

// 先列印初始化

// 根據工人池的長度,迴圈構造n個工作執行緒,然後呼叫工作執行緒的run函式,即:把任務放到執行緒池中,然後處理這個執行緒的任務請求

// 開乙個協程,一直迴圈,任務佇列中取出任務,如果有,則看工作佇列是否有空餘執行緒,如果有,則工作佇列中,取出乙個工作協程,處理job請求

func

(wp *workerpool)

run(

)// 迴圈獲取可⽤用的工作執行緒

gofunc()

}}()

}

主函式

package main

import

("fmt"

"runtime"

"time"

)// 分數結構——列印顯示用

type score struct

// 分數結構實現了job介面————即列印自己 然後睡眠2s,即有乙個score的請求任務,需要列印自己

func

(s *score)do(

)func

main()

p.jobqueue <- sc

}}()

// 每隔2秒列印目前的協程數

for}

Go併發程式設計實踐

併發程式設計一直是golang區別與其他語言的很大優勢,也是實際工作場景中經常遇到的。近日筆者在組內分享了我們常見的併發場景,及 示例,以期望大家能在遇到相同場景下,能快速的想到解決方案,或者是拿這些方案與自己實現的比較,取長補短。現整理出來與大家共享。回到頂部 很多時候,我們只想併發的做一件事情,...

Go併發程式設計實踐

併發程式設計一直是golang區別與其他語言的很大優勢,也是實際工作場景中經常遇到的。近日筆者在組內分享了我們常見的併發場景,及 示例,以期望大家能在遇到相同場景下,能快速的想到解決方案,或者是拿這些方案與自己實現的比較,取長補短。現整理出來與大家共享。很多時候,我們只想併發的做一件事情,比如測試某...

Golang百萬級高併發實踐

go語言作為新興的語言,最近發展勢頭很是迅猛,其最大的特點就是原生支援併發。它使用的是 協程 goroutine 模型 和傳統基於 os 執行緒和程序實現不同,go 語言的併發是基於使用者態的併發,這種併發方式就變得非常輕量,能夠輕鬆執行幾萬併發邏輯。go 的併發屬於 csp 併發模型的一種實現,c...