Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 什么';缓冲通道的理想大小和工作人数是多少?_Asynchronous_Go_Dispatcher_Goroutine - Fatal编程技术网

Asynchronous 什么';缓冲通道的理想大小和工作人数是多少?

Asynchronous 什么';缓冲通道的理想大小和工作人数是多少?,asynchronous,go,dispatcher,goroutine,Asynchronous,Go,Dispatcher,Goroutine,我正在尝试构建一个异步编解码器。我实现了一个作业调度器,它可以访问缓冲的作业通道 var JobChannel chan Job = make(chan Job, 100000) 调度员将工人数量作为输入,并为他们分配工作 func StartDispacher(numberOfWorkers int){ // start workers wg := &sync.WaitGroup{} wg.Add(numberOfWorkers) for i := i

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

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)
    }
}
func startdispatcher(工作人员数int){
//开始工作
wg:=&sync.WaitGroup{}
工作组.增加(工人人数)

对于i:=int(1);i答案是否定的。最佳设置不仅取决于您在
doWork
中运行的软件(该功能需要多少CPU密集型和IO),还取决于您的硬件可以执行多少指令以及您的系统可以处理多少IO


也就是说,这可能取决于您的系统是否安装了SSD,或者如果您的系统执行涉及internet访问的活动,甚至取决于您的带宽,您的CPU有多少物理核心,等等。

答案是否。最佳设置将不仅取决于您在
doWork
(该功能需要多少CPU密集型和IO)但也取决于硬件可以执行多少指令以及系统可以处理多少IO


这意味着,这可能取决于您的系统是否安装了SSD,甚至取决于您的带宽(如果您的系统执行涉及internet访问的活动)、CPU的物理内核数量等等。

您始终需要测量以确定系统在负载下的性能。好消息是,您只有两个变量,它们大部分是独立的,因此很容易推理

工作进程的数量决定了您的并发性,因此请对处理进行基准测试,以了解最佳并发性是什么。通常存在大量并发进程,超过这些进程,返回会急剧下降


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

您始终需要测量以确定系统在负载下的性能。好消息是,您只有两个变量,它们大部分是独立的,因此很容易推理

工作进程的数量决定了您的并发性,因此请对处理进行基准测试,以了解最佳并发性是什么。通常存在大量并发进程,超过这些进程,返回会急剧下降


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

在实践中,我发现有三种缓冲区大小很重要:0、1和“发送总数的上限”

0提供同步行为

1给出异步行为:它在
select
语句和
default
情况下非常有用

发送总数的上限提供了保证的非阻塞行为:您可以发送到它,而无需
select
,而无需冒goroutine泄漏的风险


其他数字可能提供稍好的吞吐量,但在规模上,它们仍将在包含通道内部互斥的缓存线上竞争,并且它们更有可能掩盖潜在的死锁和goroutine泄漏。

在实践中,我发现有三种缓冲区大小很重要:0、1和1“发送总数的上限”

0提供同步行为

1给出异步行为:它在
select
语句和
default
情况下非常有用

发送总数的上限提供了保证的非阻塞行为:您可以发送到它,而无需
select
,而无需冒goroutine泄漏的风险


其他数字可能会提供稍好的吞吐量,但在规模上,它们仍将在包含通道内部互斥的缓存线上竞争,并且它们更有可能掩盖潜在的死锁和goroutine泄漏。

最佳值完全取决于您的系统和需求。至于制造它们“独立于物理设置”,你能解释一下你的意思吗?你当然可以配置这些值。我的意思是,有没有某种公式,我可以用输入值作为代码来实现,以给我提供最佳的大小和工人数量?在接近99.999%的情况下,什么是“最佳”呢"就是你最快可以发布的。换句话说:优化吞吐量,比如说,提高1%,可能需要2周的额外工时。对于大多数应用程序来说,这是一个非常昂贵的改进。换句话说:不要忘记优化时衡量性能所需的时间。你的开发人员时间通常最好花在其他地方。the最佳值完全取决于您的系统和要求。至于使其“独立于物理设置”,你能解释一下你的意思吗?你当然可以配置这些值。我的意思是,有没有某种公式,我可以用输入值作为代码来实现,以给我最佳的大小和工人数量?在接近99.999%的情况下,“最佳”是什么就是你最快可以发布的。换句话说:优化吞吐量,比如说,提高1%,可能需要2周的额外工时。对于大多数应用程序来说,这是一个非常昂贵的改进。换句话说:不要忘记优化时衡量性能所需的时间。你的开发人员时间通常最好花在其他地方。that是正确的,但作为一个编解码器,我只依赖于CPU和内存(不使用任何IO或网络)。考虑到这一点,当您仍然有内存访问、L1和L2缓存以及物理内核数时,是否有可能为任何机器X找到正确的通道大小。这是正确的,但作为一个编解码器,我只依赖于CPU和内存(不使用任何IO或网络).考虑到这一点,是否有可能找到
workDispatcher.StartDispacher(2*runtime.NumCPU())
for i := 0; i < 200000; i++ {
    j := workDispatcher.Job{
        BytePacket: d,
        JobType:    workDispatcher.DECODE_JOB,
    }
    workDispatcher.JobChannel <- j
}