精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊并發(fā)庫 Conc,你學(xué)會了嗎?

開發(fā) 項目管理
我們在寫通用庫和框架的時候,都有一個原則,并發(fā)控制與業(yè)務(wù)邏輯分離,背離這個原則肯定做不出通用庫。

上個月 sourcegraph 放出了 conc[1] 并發(fā)庫,目標(biāo)是 better structured concurrency for go, 簡單的評價一下

每個公司都有類似的輪子,與以往的庫比起來,多了泛型,代碼寫起來更優(yōu)雅,不需要 interface, 不需要運行時 assert, 性能肯定更好

我們在寫通用庫和框架的時候,都有一個原則,并發(fā)控制與業(yè)務(wù)邏輯分離,背離這個原則肯定做不出通用庫

整體介紹

1. WaitGroup 與 Panic

標(biāo)準(zhǔn)庫自帶 sync.WaitGroup 用于等待 goroutine 運行結(jié)束,缺點是我們要處理控制部分

圖片

代碼里大量的 wg.Add 與 wg.Done 函數(shù),所以一般封裝成右側(cè)的庫

type WaitGroup struct {
wg sync.WaitGroup
pc panics.Catcher
}

// Go spawns a new goroutine in the WaitGroup.
func (h *WaitGroup) Go(f func()) {
h.wg.Add(1)
go func() {
defer h.wg.Done()
h.pc.Try(f)
}()
}

但是如何處理 panic 呢?簡單的可以在閉包 doSomething 運行時增加一個 safeGo 函數(shù),用于捕捉 recover

圖片

原生 Go 要生成大量無用代碼,我司 repo 運動式的清理過一波,也遇到過 goroutine 忘寫 recover 導(dǎo)致的事故。conc 同時提供 catcher 封裝 recover 邏輯,conc.WaitGroup 可以選擇 Wait 重新拋出 panic, 也可以 WaitAndRecover 返回捕獲到的 panic 堆棧信息

func (h *WaitGroup) Wait() {
h.wg.Wait()

// Propagate a panic if we caught one from a child goroutine.
h.pc.Repanic()
}

func (h *WaitGroup) WaitAndRecover() *panics.RecoveredPanic {
h.wg.Wait()

// Return a recovered panic if we caught one from a child goroutine.
return h.pc.Recovered()
}

2. ForEach 與 Map

高級語言很多的基操,在 go 里面很奢侈,只能寫很多繁瑣代碼。conc封裝了泛型版本的 iterator 和 mapper

func process(values []int) {
iter.ForEach(values, handle)
}

func concMap(input []int, f func(int) int) []int {
return iter.Map(input, f)
}

上面是使用例子,用戶只需要寫業(yè)務(wù)函數(shù) handle. 相比 go1.19 前的版本,泛型的引入,使得基礎(chǔ)庫的編寫更游刃有余

// Iterator is also safe for reuse and concurrent use.
type Iterator[T any] struct {
// MaxGoroutines controls the maximum number of goroutines
// to use on this Iterator's methods.
//
// If unset, MaxGoroutines defaults to runtime.GOMAXPROCS(0).
MaxGoroutines int
}

MaxGoroutines 默認(rèn) GOMAXPROCS 并發(fā)處理傳參 slice, 也可以自定義,個人認(rèn)為不合理,默認(rèn)為 1 最妥

// ForEachIdx is the same as ForEach except it also provides the
// index of the element to the callback.
func ForEachIdx[T any](input []T, f func(int, *T)) { Iterator[T]{}.ForEachIdx(input, f) }

ForEachIdx 在創(chuàng)建 Iterator[T]{} 可以自定義并發(fā)度,最終調(diào)用 iter.ForEachIdx

// ForEachIdx is the same as ForEach except it also provides the
// index of the element to the callback.
func (iter Iterator[T]) ForEachIdx(input []T, f func(int, *T)) {
......
var idx atomic.Int64
// Create the task outside the loop to avoid extra closure allocations.
task := func() {
i := int(idx.Add(1) - 1)
for ; i < numInput; i = int(idx.Add(1) - 1) {
f(i, &input[i])
}
}

var wg conc.WaitGroup
for i := 0; i < iter.MaxGoroutines; i++ {
wg.Go(task)
}
wg.Wait()
}

ForEachIdx 泛型函數(shù)寫得非常好,略去部分代碼。樸素的實現(xiàn)在 for 循環(huán)里創(chuàng)建閉包,傳入 idx 參數(shù),然后 wg.Go 去運行。但是這樣會產(chǎn)生大量閉包,我司遇到過大量閉包,造成 heap 內(nèi)存增長很快頻繁觸發(fā) GC 的性能問題,所以在外層只創(chuàng)建一個閉包,通過 atomic 控制 idx

func Map[T, R any](input []T, f func(*T) R) []R {
return Mapper[T, R]{}.Map(input, f)
}

func MapErr[T, R any](input []T, f func(*T) (R, error)) ([]R, error) {
return Mapper[T, R]{}.MapErr(input, f)
}

Map 與 MapErr 也只是對 ForEachIdx 的封裝,區(qū)別是處理 error

3. 各種 Pool 與 Stream

Pool 用于并發(fā)處理,同時 Wait 等待任務(wù)結(jié)束。相比我司現(xiàn)有 concurrency 庫

  • 增加了泛型實現(xiàn)
  • 增加了對 goroutine 的復(fù)用
  • 增加并發(fā)度設(shè)置(我司有,但 conc 實現(xiàn)方式更巧秒)
  • 支持的函數(shù)簽名更多

先看一下支持的接口

Go(f func())
Go(f func() error)
Go(f func(ctx context.Context) error)
Go(f func(context.Context) (T, error))
Go(f func() (T, error))
Go(f func() T)
Go(f func(context.Context) (T, error))

理論上這一個足夠用了,傳參 Context, 返回泛型類型與錯誤。

Wait() ([]T, error)

這是對應(yīng)的 Wait 回收函數(shù),返回泛型結(jié)果 []T 與錯誤。具體 Pool 實現(xiàn)由多種組合而來:Pool, ErrorPool, ContextPool, ResultContextPool, ResultPool

func (p *Pool) Go(f func()) {
p.init()

if p.limiter == nil {
// No limit on the number of goroutines.
select {
case p.tasks <- f:
// A goroutine was available to handle the task.
default:
// No goroutine was available to handle the task.
// Spawn a new one and send it the task.
p.handle.Go(p.worker)
p.tasks <- f
}
}
......
}

func (p *Pool) worker() {
// The only time this matters is if the task panics.
// This makes it possible to spin up new workers in that case.
defer p.limiter.release()

for f := range p.tasks {
f()
}
}

復(fù)用方式很巧妙,如果處理速度足夠快,沒必要過多創(chuàng)建 goroutine

Stream 用于并發(fā)處理 goroutine, 但是返回結(jié)果保持順序

type Stream struct {
pool pool.Pool
callbackerHandle conc.WaitGroup
queue chan callbackCh

initOnce sync.Once
}

實現(xiàn)很簡單,queue 是一個 channel, 類型 callbackCh 同樣也是 channel, 在真正派生 goroutine 前按序順生成 callbackCh 傳遞結(jié)果

Stream 命名很差,容易讓人混淆,感覺叫 OrderedResultsPool 更理想,整體非常雞肋

超時

超時永遠(yuǎn)是最難處理的問題,目前 conc 庫 Wait 函數(shù)并沒有提供 timeout 傳參,這就要求閉包內(nèi)部必須考濾超時,如果添加 timeout 傳參,又涉及 conc 內(nèi)部庫并發(fā)問題題

Wait() ([]T, error)

比如這個返回值,內(nèi)部 append 到 slice 時是有鎖的,如果 Wait 提前結(jié)束了會發(fā)生什么?

[]T 拿到的部分結(jié)果只能丟棄,返回給上層 timeout error

Context 框架傳遞參數(shù)

通用庫很容易做的臃腫,我司并發(fā)庫會給閉包產(chǎn)生新的 context, 并繼承所需框架層的 metadata, 兩種實現(xiàn)無可厚非,這些細(xì)節(jié)總得要處理

小結(jié)

代碼量不大,感興趣的可以看看。沒有造輪子的必要,夠用就行,這種庫寫了也沒價值

參考資料

[1]conc: https://github.com/sourcegraph/conc,

責(zé)任編輯:武曉燕 來源: 董澤潤的技術(shù)筆記
相關(guān)推薦

2024-06-12 08:36:25

2024-03-05 10:09:16

restfulHTTPAPI

2022-12-26 07:48:04

敏捷項目

2023-07-10 08:36:21

工具pptword

2024-08-19 10:24:14

2022-07-11 09:00:37

依賴配置文件Mybati

2022-04-13 09:01:45

SASSCSS處理器

2022-09-26 08:49:11

Java架構(gòu)CPU

2022-12-08 10:49:43

2023-03-07 07:50:15

Transactio事務(wù)代碼

2024-11-08 08:56:01

2024-03-04 07:41:18

SpringAOPOOP?

2022-12-27 08:45:00

繪制菜單符號

2022-10-11 08:48:08

HTTP狀態(tài)碼瀏覽器

2022-10-25 07:24:23

數(shù)據(jù)庫TiDBmysql

2023-06-05 08:36:04

SQL函數(shù)RANK()

2024-10-29 08:08:44

2023-02-15 08:41:56

多層維表性能寬表

2022-12-14 08:31:43

#error編譯命令

2022-03-05 23:29:18

LibuvwatchdogNode.js
點贊
收藏

51CTO技術(shù)棧公眾號

国产一区二区视频播放| 欧美黑人极品猛少妇色xxxxx| 午夜久久久久久久久久久| 精品久久久无码中文字幕| av亚洲免费| 欧美精品v日韩精品v韩国精品v| 免费亚洲精品视频| 亚洲网站免费观看| 伊人成年综合电影网| 国产亚洲精品91在线| 欧美黄色免费影院| 五月天婷婷激情网| 毛片av一区二区| 色七七影院综合| a级一a一级在线观看| 日韩色性视频| 亚洲色图在线视频| 久久久com| 国产手机av在线| 免费视频一区| 欧美国产精品日韩| eeuss中文字幕| 香蕉一区二区| 欧美成人官网二区| 久草热视频在线观看| 国产cdts系列另类在线观看| 国产一区二区三区高清播放| 国产精品wwww| 99热在线观看免费精品| 国产一区二区观看| 欧美日韩国产综合一区二区 | www.久久精品| 成人免费视频a| 精品乱码一区内射人妻无码| 一本色道久久综合亚洲精品不卡| 精品一区二区三区电影| 最新中文字幕2018| 中国色在线日|韩| 亚洲一区二区三区小说| 久久久水蜜桃| 91丨porny丨在线中文 | 蜜臀久久99精品久久久久久宅男| 伊人av在线播放| 激情视频网站在线播放色| 亚洲视频一二三区| 在线播放豆国产99亚洲| caoporn国产精品免费视频| 26uuu精品一区二区| 国产一区二区三区四区hd| 性生活三级视频| 国产精品一二二区| 成人91视频| 在线视频精品免费| 日韩精品久久理论片| 欧美激情精品久久久久久久变态 | 这里只有精品9| 丝袜美腿成人在线| 国产精品成人播放| 亚洲在线视频播放| 国产精品综合| 日本成熟性欧美| www.久久视频| 乱一区二区av| 亚洲sss综合天堂久久| 国产偷人妻精品一区二区在线| 国产日韩欧美三级| 热久久免费视频精品| 在线永久看片免费的视频| 久久亚洲精选| 国产日韩在线看片| 国产视频手机在线观看| 免费成人性网站| 成人精品视频在线| 精品人妻伦一二三区久久 | 国产女18毛片多18精品| 久久中文在线| 国产精品无av码在线观看| 91超薄丝袜肉丝一区二区| 国产一区二区三区精品视频| 日本成熟性欧美| 日韩xxx视频| 国产在线看一区| 国产精品国产三级国产专区53| 免费黄色片视频| 久久精品国产精品亚洲精品| 999在线观看免费大全电视剧| 亚洲香蕉在线视频| 国产成人免费视频一区| 欧美二区在线| 黄色网址在线免费| 福利一区福利二区微拍刺激| 无码人妻aⅴ一区二区三区日本| 日本在线丨区| 国产精品萝li| 精品无码一区二区三区爱欲| 成人软件在线观看| 欧美一级黄色大片| 制服 丝袜 综合 日韩 欧美| 欧美18免费视频| 中文字幕日本精品| 日本一区二区网站| 黑人精品欧美一区二区蜜桃| 国产精品户外野外| 精品人妻伦一二三区久久| 精品一区二区三区在线播放视频 | 青青青在线观看视频| 成人免费直播| 日韩一级黄色片| 亚洲黄色免费视频| 日韩午夜黄色| 亚洲伊人久久大香线蕉av| 女人天堂在线| av网站一区二区三区| 亚洲一区尤物| 日本成人伦理电影| 亚洲精品电影久久久| 永久免费看黄网站| 日av在线不卡| 欧美日韩精品久久| h片在线观看下载| 欧美丰满少妇xxxxx高潮对白| 在线免费黄色网| 亚洲欧洲免费| 91爱视频在线| 丰满少妇被猛烈进入| 自拍偷拍欧美激情| 亚洲 激情 在线| 国产一区二区三区网| 97国产成人精品视频| 国产黄色av片| 亚洲色图在线视频| 五月天视频在线观看| 国产成人一区| 日韩av电影手机在线| 视频一区二区免费| 亚洲成人黄色影院| 成人免费毛片播放| 久久av影视| 日本午夜人人精品| 欧美女子与性| 色香蕉久久蜜桃| 亚洲欧美日韩三级| 成久久久网站| 国产日本欧美视频| 69av亚洲| 欧美理论电影在线| 亚洲区一区二区三| 久久精品国产精品亚洲精品| 一本久道久久综合| 欧美卡一卡二| 亚洲成人免费在线视频| 国产成人啪精品午夜在线观看| 久久人人97超碰国产公开结果| 国产在线观看精品一区二区三区| 亚洲男人天堂久久| 欧美国产日产图区| 欧美午夜aaaaaa免费视频| 成人精品视频| 91久热免费在线视频| 性感美女视频一二三| 一区二区三区国产| 艳妇乳肉豪妇荡乳xxx| 一本一本久久| 日本不卡高清视频一区| 四虎成人在线| 久久综合伊人77777蜜臀| a级片在线视频| 亚洲h在线观看| 实拍女处破www免费看| 蜜臀av一区二区在线免费观看 | 国产激情久久久| bbbbbbbbbbb在线视频| 91麻豆精品久久久久蜜臀| av网站免费在线看| 国产精品日本欧美一区二区三区| 亚洲free性xxxx护士hd| 在线观看免费黄色| 日韩免费电影一区| av大片在线免费观看| 国产精品久久久久久久久图文区| 国产精品69页| 九热爱视频精品视频| 热久久免费视频精品| 少妇性bbb搡bbb爽爽爽欧美| 欧美私模裸体表演在线观看| 成人观看免费视频| 国产视频一区二区在线| 亚洲色图欧美自拍| 中日韩视频在线观看| 一级做a爰片久久| 美女主播精品视频一二三四| 国产精品久久久久免费a∨| 噜噜噜噜噜在线视频| 91麻豆精品国产91久久久更新时间| 黄色一级片一级片| 不卡视频一二三四| 老司机午夜性大片| 国产精品人人爽人人做我的可爱| 久久久久久国产精品mv| crdy在线观看欧美| 日韩av免费网站| 牛牛精品视频在线| www国产亚洲精品久久网站| 午夜视频1000| 日韩视频免费观看高清完整版| 欧美第一页在线观看| 久久老女人爱爱| 日本少妇一级片| 青青草国产成人av片免费| 精品久久久久久无码中文野结衣| 久久午夜影院| 亚洲一区制服诱惑| 欧美少妇精品| 欧美国产日韩中文字幕在线| 日韩在线免费电影| 亚洲系列中文字幕| 亚洲av成人精品一区二区三区在线播放 | 国产精品综合二区| 男女污污的视频| 亚洲中午字幕| 成人免费视频91| 欧美国产免费| 四虎4hu永久免费入口| 日韩在线高清| 亚洲精品8mav| 欧美精品一区二区久久| 欧美成ee人免费视频| 久久久久久久久久久久久久久久久久久久| 91大神福利视频在线| 毛片网站在线看| 伦理中文字幕亚洲| 免费在线观看黄色| 日韩在线视频网站| 在线观看完整版免费| 中文字幕亚洲欧美| 91免费在线| 最近中文字幕2019免费| 精品毛片一区二区三区| 欧美一区二区在线视频| 欧美一二三区视频| 欧美日韩国产激情| 日韩精品一区二区三区国语自制 | 婷婷色中文字幕| 自拍偷拍亚洲欧美日韩| 黄色片子在线观看| 亚洲乱码国产乱码精品精的特点| 国产熟妇久久777777| 国产成人免费视频网站| 香蕉视频在线观看黄| 国产乱子轮精品视频| 成人性生生活性生交12| 日本人妖一区二区| 久久久性生活视频| 国产一区成人| 日本www高清视频| 美女视频网站黄色亚洲| 国产在线青青草| 水野朝阳av一区二区三区| 一区二区三区国产免费| 美国欧美日韩国产在线播放| 在线观看国产福利| 国产成人av电影在线观看| 色婷婷狠狠18| 国产毛片精品视频| 精品人妻一区二区免费| 91视频国产资源| 亚洲av毛片基地| 亚洲男人电影天堂| 日韩毛片在线视频| 欧美亚洲综合网| 国产女人18毛片水真多| 欧美日韩国产不卡| 亚洲a视频在线观看| 91精选在线观看| 四虎精品一区二区三区| 精品国产污污免费网站入口| 亚洲欧美日韩免费| 中文字幕一精品亚洲无线一区| 久久久久久女乱国产| xxx一区二区| av免费在线视| 国产精品精品视频| 亚洲一区二区三区日本久久九| 成人一区二区电影| 亚洲精品三区| 国产综合色一区二区三区| 成人3d动漫在线观看| 性一交一乱一伧国产女士spa| 欧美va天堂在线| 丰满人妻中伦妇伦精品app| 紧缚捆绑精品一区二区| 黄色录像a级片| 中文字幕亚洲一区二区av在线 | 99久久九九| 成年人黄色在线观看| 99热免费精品| 欧美日韩在线视频一区二区三区| 亚洲综合国产| 欧美综合在线观看视频| 国产乱对白刺激视频不卡| 中文字幕第10页| 国产偷国产偷亚洲高清人白洁| 欧美熟妇激情一区二区三区| 亚洲一区电影777| 中文字幕欧美人妻精品| 91精品中文字幕一区二区三区| 精品二区在线观看| 一区二区三区精品99久久| 麻豆mv在线看| 国产精品xxxxx| 国产无遮挡裸体免费久久| 99久久久无码国产精品性色戒| 欧美一区二区| 日本www在线播放| 国产高清亚洲一区| 亚洲综合久久av一区二区三区| 亚洲精品第一国产综合野| 欧美高清69hd| 亚洲日本欧美中文幕| 日本在线影院| 成人春色激情网| 日韩精品第一区| 欧美黑人又粗又大又爽免费| 国内精品视频666| 一二三四国产精品| 91国产免费观看| 欧美zozo| 日韩免费不卡av| 亚洲人成亚洲精品| 免费观看中文字幕| 久久99热国产| 潘金莲一级黄色片| 午夜精品福利一区二区三区av| 免费视频网站在线观看入口| 亚洲黄一区二区| 99re6在线精品视频免费播放| 国产日韩中文字幕| 日韩成人影院| 制服丝袜中文字幕第一页 | 日本不卡视频一区| 亚洲国产精品久久人人爱蜜臀| 探花国产精品一区二区| 国产亚洲视频在线观看| 日韩精品影片| 亚洲国产一区二区精品视频| 亚洲福利一区| 欧美xxxx×黑人性爽| 天天综合色天天综合| 日本免费不卡| 国产精品看片资源| 久久99偷拍| 欧美日韩亚洲第一| 国产人久久人人人人爽| 这里只有精品国产| 久久九九全国免费精品观看| 国产亚洲字幕| 欧洲精品在线播放| 337p粉嫩大胆色噜噜噜噜亚洲| 久久黄色免费网站| 亚洲精品大尺度| 欧美free嫩15| 日本女人高潮视频| 成人中文字幕在线| 天天操天天爽天天干| 一本色道久久88综合日韩精品 | 国产精品久久久久久av福利| 欧美男人操女人视频| av天堂永久资源网| av电影在线观看完整版一区二区| 欧美黑吊大战白妞| 7777精品久久久大香线蕉| 国产蜜臀av在线播放| 精品在线观看一区二区| 美女尤物国产一区| 久久久久人妻一区精品色欧美| 日韩亚洲欧美综合| 国产欧洲在线| 伊人久久大香线蕉午夜av| 风间由美一区二区三区在线观看| 欧美黑人性猛交xxx| 亚洲国产精品悠悠久久琪琪| 成人免费黄色| 久久久久久www| 国产精品久久久久永久免费观看| 中文字幕欧美人妻精品一区蜜臀| 尤物九九久久国产精品的分类| 中文字幕乱码在线播放| 快播亚洲色图| 久久高清免费观看| 91人妻一区二区三区蜜臀| 日韩精品免费视频| 伊人久久综合网另类网站| 久色视频在线播放| 亚洲视频一二三| 国产女主播在线直播| 国产另类自拍| 国内精品国产三级国产a久久| 欧美激情精品久久久久久免费 | 激情在线观看视频| 日本韩国一区二区三区|