如果有人分析了这两种范式之间的性能差异,我很好奇。
让侦听器goroutine(可能是几个)在套接字上侦听并生成一个新的goroutine来处理该信息并将其发送到任何必须去的地方。在发送命令之后,例程将完成并将被销毁。每个请求都会创建一个例程,然后在完成后将其销毁。
让侦听器goroutine(可能是几个)侦听套接字并将数据传递给通道。许多goroutine在通道接收时阻塞,并将轮流从通道中取出并处理它们。完成后,例程将在通道上等待以获取更多信息。在这种范例中,例程永远不会被破坏。一对主程序在通道上接收套接字信息,其他例程在通道上等待处理信息。例程永远不会被破坏。
我的问题是系统在接收中接收大量小信息(每条消息0.5-1.5kb),但同时有大量消息(高容量,低容量),更好的范例速度和处理。有一堆例程坐着并使用频道将它们传播到一堆听力程序中?或者,为每个请求创建路由并在每个请求后结束该例程?
甚至基本的意识形态和猜想都很酷。感谢。
答案 0 :(得分:2)
一般来说,我倾向于发现在没有重复使用它们的情况下产生无数例程正在浪费:即使goroutines价格便宜,它们也不是免费的,并且意味着调度成本。
现在,这两种方法在高负载下都有缺点:产生例程会花费你的内存,调度,并且可能会使程序停止运行,而使用通道时你的请求会挂起,直到处理完前一个。
我通常的方法是做一个基于批处理的管道(受到优秀的Go Concurrency Patterns: Pipelines and cancellations博客文章的启发):
通过这种方式,您可以精确控制管道的流量和行为,同时保持多个工人的优势。如果缓冲区超过限制大小,生成或终止新工作以加载负载等,则可以通过删除命令请求轻松实现溢出机制。