其他分享
首页 > 其他分享> > 商汤Golang笔试题

商汤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()
}

 

标签:int,workers,笔试,ctx,DoOnePieceFunc,pieces,Golang,商汤,func
来源: https://www.cnblogs.com/peteremperor/p/16056423.html