golang题目 该函数是提供给第三方的并发处理框架,其启动workers个协程并发处理用户的任务, 用户任务的数据被分为总共pieces份,数据被标号为0到pieces-1,doOnePiece是用

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)
	})

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值