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

时间:2017-03-20 06:46:44

标签: go goroutine gorilla

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

1 个答案:

答案 0 :(得分:5)

  

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

你认为错了。排序。

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

  

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

可以。但是你问的是错误的问题。

您不主要使用Go例程来利用不同的CPU核心(尽管这也是一个好处)。您可以使用Go例程来防止程序在执行需要一段时间的事情时阻止。

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

没有例行程序,在执行这些操作时,您的服务器将无法执行任何其他操作。因此,如果您的典型HTTP请求花了1秒钟来查找DNS,验证授权cookie,从数据库中查找结果并发送响应,则不能同时提供其他HTTP客户端。

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

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

一些建议:

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