标签:int workers 笔试 ctx DoOnePieceFunc pieces Golang 商汤 func
type DoOnePieceFunc func(piece int) func MyFunction(ctx context.Context, workers, pieces int, doOnePiece DoOnePieceFunc)
该函数是提供给第三方的并发处理框架,其启动workers个协程并发处理用户的任务,用户任务的数据被分为总共pieces份,数据被标号为0到pieces-1,doOnePiece是用户自定义的用于处理一份数据的方法,其接收一个参数piece来指定数据的标号。MyFunction并发的执行用户任务,直到任务数据被全部处理完,或者ctx出现停止信号(ctx.Done()),每个worker同时只能处理一份数据。
注:
可以使用sync.WaitGroup
var stopCh <-chan strcut{} stopCh = ctx.Done()
package main import ( "fmt" "sync" "context" ) type DoOnePieceFunc func(piece int) func MyFunction(ctx context.Context, workers, pieces int, doOnePiece DoOnePieceFunc) { // 校验参数有效性 if workers <= 0 || pieces <= 0 || doOnePiece == nil { return } if workers > pieces { workers = pieces } // 准备消费队列 toProcess := make(chan int, pieces) for i := 0; i < pieces; i++ { toProcess <- i } close(toProcess) var stopCh <-chan struct{} if ctx != nil { stopCh = ctx.Done() } wg := sync.WaitGroup{} wg.Add(workers) for i := 0; i < workers; i++ { go func() { defer wg.Done() // 动态的从消费队列中获取piece for piece := range toProcess { select { case <-stopCh: return default: doOnePiece(piece) } } }() } wg.Wait() }
标签:int,workers,笔试,ctx,DoOnePieceFunc,pieces,Golang,商汤,func
来源: https://www.cnblogs.com/peteremperor/p/16056423.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。