首页 > 解决方案 > 缓冲通道的理想大小和工人数量是多少?

问题描述

我正在尝试构建一个异步编解码器。我已经实现了一个作业调度程序,它可以访问缓冲的作业通道

var JobChannel chan Job = make(chan Job, 100000)

调度员将工作人员的数量作为输入并将工作分配给他们

func StartDispacher(numberOfWorkers int){
    // start workers
    wg := &sync.WaitGroup{}
    wg.Add(numberOfWorkers)
    for i := int(1); i <= numberOfWorkers; i++ {
        go func(i int) {
            defer wg.Done()
            for j := range JobChannel {
                doWork(i, j)
            }
        }(i)
    }
}

我的主要功能启动调度程序并继续为其分配工作(在本例中为 200000 个工作)

workDispatcher.StartDispacher(2*runtime.NumCPU())
for i := 0; i < 200000; i++ {
    j := workDispatcher.Job{
        BytePacket: d,
        JobType:    workDispatcher.DECODE_JOB,
    }
    workDispatcher.JobChannel <- j
}

实验后:原来有两个因素会影响这段代码的性能

是否有一种标准方法可以找到这些参数的最佳值,是否可以使这些值独立于运行代码的机器的物理设置?

标签: asynchronousgodispatchergoroutine

解决方案


您总是需要测量以确定系统在负载下的性能。这里的好消息是你只有 2 个变量,它们大多是独立的,所以很容易推理。

工作人员的数量决定了您的并发性,因此对处理进行基准测试以查看最佳并发性是多少。通常有许多并发进程,超过这些进程的回报会急剧下降。

通道的大小就像系统中的任何其他“缓冲区”一样。更大的缓冲区可以处理更大的输入峰值,但可能会导致更大的延迟和内存使用。


推荐阅读