【发布时间】:2018-10-20 01:35:33
【问题描述】:
我正在尝试构建一个异步编解码器。我已经实现了一个作业调度程序,它可以访问缓冲的作业通道
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
}
经过实验:原来有两个因素会影响这段代码的性能
- 缓冲通道的大小
JobChannel - 那里的工人数量
func StartDispacher(numberOfWorkers int)
是否有一种标准方法可以找到这些参数的最佳值,是否可以使这些值独立于运行代码的机器的物理设置?
【问题讨论】:
-
最佳值完全取决于您的系统和要求。至于让它们“独立于物理设置”,你能解释一下你的意思吗?您当然可以使这些值可配置。
-
我的意思是有某种公式可以实现为带有输入值的代码,从而为我提供最佳尺寸和工人数量
-
在接近 99.999% 的情况下,“最佳”是您可以最快发布的任何内容。换句话说:为提高 1% 的吞吐量进行优化,可能会花费 2 周的额外工时。对于大多数应用程序来说,这是一个相当昂贵的改进。换一种说法:不要忘记优化时衡量性能所花费的时间。您的开发人员时间通常最好花在其他地方。
标签: asynchronous go dispatcher goroutine