package main
import (
"context"
"fmt"
"sync"
"time"
)
/*
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同时只能处理一份数据。
*/
type DoOnePieceFunc func(piece int)
func MyFunction(ctx context.Context, workers, pieces int, doOnePiece DoOnePieceFunc) {
chs := make(chan int, pieces)
for i := 0; i < pieces; i++ {
chs <- i
}
wg := &sync.WaitGroup{}
for i := 0; i < workers; i++ {
wg.Add(1)
go func(idx int) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Printf("goroutinue[%d] got ctx.done\n", idx)
return
case val, ok := <-chs:
if !ok {
fmt.Printf("goroutinue[%d] read null\n", idx)
return
}
fmt.Printf("goroutinue[%d] read %d\n", idx, val)
doOnePiece(val)
default:
}
}
}(i)
}
close(chs)
wg.Wait()
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go func() {
//time.Sleep(time.Millisecond * 500) // 测试关闭
//cancel()
}()
defer cancel()
MyFunction(ctx, 5, 100, func(piece int) {
time.Sleep(time.Second * 1)
})
}
golang题目 该函数是提供给第三方的并发处理框架,其启动workers个协程并发处理用户的任务, 用户任务的数据被分为总共pieces份,数据被标号为0到pieces-1,doOnePiece是用
最新推荐文章于 2025-12-06 15:23:54 发布
886

被折叠的 条评论
为什么被折叠?



