在gorilla/mux框架中使用Go例程

Rak*_*ain 2 go goroutine gorilla

我们正在使用gorilla mux框架来处理Web请求,我想它会在所有cpu核心上自动运行.在这种情况下使用go例程是否有利于cpu密集型进程,例如循环遍历大型对象?

Fli*_*mzy 5

我想自动运行在所有的cpu核心上.

你猜错了.有点.

从Go 1.5开始,Go将通过在不同核心上运行go例程来使用所有核心.但如果你不使用go例程,就没有办法利用它.

在这种情况下使用go例程是否有利于cpu密集型进程,例如循环遍历大型对象?

可以有.但是你问的是错误的问题.

您不首先使用Go例程来利用不同的CPU核心(尽管这也是一个好处).您可以使用Go例程来防止程序在执行需要一段时间的操作时阻塞.

对于Web应用程序,大多数请求通常不是 CPU密集型的.但他们通常会花很多时间(以计算机术语)等待事情的发生.他们等待请求主机名上的DNS查找,等待数据库查找用户凭据以建立会话,等待数据库存储或返回行以生成HTTP响应等.

没有常规,在做这些事情时,你的服务器将无法做任何其他事情.因此,如果典型的HTTP请求花了1秒钟来查找DNS,验证授权cookie,从数据库中查找结果并发送响应,则不能同时提供其他HTTP客户端.

幸运的http是,Gorilla(以及Go的几乎所有其他Web框架)使用的包已经使用Go例程来处理请求.所以你已经在每个HTTP请求中使用(至少)一个Go例程.

使用额外的go例程是否有意义取决于您的应用程序设计,而不是"使用更多的CPU核心".

一些建议:

  1. 如果您正在做多个事情来提供可以并行完成的请求,请使用go例程.假设您需要执行3个DB查询,您可以在Go例程中执行每个查询,以便它们同时运行.它们可能运行在不同的CPU内核上,但这与实际性能完全无关,因为每个内核基本上什么都不做,只是在等待数据库.但你仍然会提高性能.(为了完整起见,我会提到goroutines不是并行运行数据库查询的唯一方法 - 但它们是惯用的Go方式,以及Go中的简单方法).
  2. 如果您有由HTTP请求运行但不影响HTTP响应的任务,则可以在Go例程中运行它们,以便您的响应可以更快地返回.记录是一个常见的例子.您可能希望记录HTTP请求,但如果记录器速度很慢,您可能不希望在发送HTTP响应之前等待记录完成.所以在日常工作中这样做.记录器可以在客户端收到响应花费很多时间并完成.另一个例子是发送电子邮件 - 请不要等待在回复HTTP客户端之前发送电子邮件.