商汤Golang笔试题
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() }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-03-25 Couldn't open file /mnt/iso/repodata/repomd.xml
2021-03-25 dos2unix批量转换命令
2019-03-25 Linux操作系统加固
2019-03-25 MySQL服务安全加固
2019-03-25 PHP环境安全加固
2019-03-25 Tomcat服务安全加固
2019-03-25 网站被植入Webshell的解决方案