asynchronous - 缓冲通道的理想大小和工人数量是多少?
问题描述
我正在尝试构建一个异步编解码器。我已经实现了一个作业调度程序,它可以访问缓冲的作业通道
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)
是否有一种标准方法可以找到这些参数的最佳值,是否可以使这些值独立于运行代码的机器的物理设置?
解决方案
您总是需要测量以确定系统在负载下的性能。这里的好消息是你只有 2 个变量,它们大多是独立的,所以很容易推理。
工作人员的数量决定了您的并发性,因此对处理进行基准测试以查看最佳并发性是多少。通常有许多并发进程,超过这些进程的回报会急剧下降。
通道的大小就像系统中的任何其他“缓冲区”一样。更大的缓冲区可以处理更大的输入峰值,但可能会导致更大的延迟和内存使用。
推荐阅读
- node.js - 'multer' 在示例代码中有效,但在我的项目中无效
- c++ - C++ 应用程序访问冲突 - 使用 CoInitializeEx 初始化 COM
- google-cloud-platform - 谷歌云平台没有足够的可用资源[启动实例]
- python - 我在运行 elif n == 2 的代码时发现错误
- eslint - 使用 Angular 的 eslint 和更漂亮 - 'OnInit' 已定义但从未使用过
- javascript - 使用 React 和 Material UI 过滤带有复选框的表格
- java - 删除元素 Arraylist 并在空白处移动
- excel - 开始日期和结束日期填充水平
- python - 如何让 pyodbc 在 Azure Web App 中工作
- delphi - 检查未分配的布尔局部变量总是返回 True?