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

3
我们正在使用gorilla mux框架处理Web请求,我认为它会自动在所有CPU核心上运行。在这种情况下,对于需要进行大量循环的CPU密集型进程,使用go协程是否有好处?

5
Alexander R,这已经很久不是真的了,你不需要设置gomaxprocs。 - Kenny Grant
1个回答

11
我认为自动在所有CPU内核上运行。
你的想法是错误的,有一点对的。
从Go 1.5开始,Go会通过在不同的内核上运行Go协程来使用您的所有内核。 但是,如果您不使用Go协程,它就无法利用这一点。
在这种情况下,是否使用Go协程可以获得好处,例如循环遍历大型对象?
可能会有好处。 但您正在问错误的问题。
您并非主要使用Go协程以利用不同的CPU核心(尽管这也可能是一个好处)。 您使用Go协程是为了在执行需要时间的操作时防止程序阻塞。
在Web应用程序的情况下,大多数请求实际上根本不需要CPU。 但它们通常花费很长时间(在计算机术语中)等待事情发生。 它们等待DNS查找请求主机名,等待数据库查找用户凭据以建立会话,等待数据库存储或返回行以生成HTTP响应等。
没有Go协程,在做这些事情时,您的服务器将无法执行其他任何操作。 因此,如果您典型的HTTP请求花费了例如1秒钟的时间来查找DNS,验证授权cookie,查找数据库结果并发送响应,则无法同时提供其他HTTP客户端服务。
幸运的是,“http”软件包(由Gorilla使用,也由Go的几乎所有其他Web框架使用)已经使用Go协程来处理请求。 所以您已经在每个HTTP请求中使用(至少)一个Go协程。
是否有意义使用其他Go协程更多地取决于您的应用程序设计,而不是“使用更多CPU核心”。
一些建议:
  • 如果您需要同时执行多个任务来处理请求,可以使用Go协程。例如,假设您需要执行3个数据库查询,您可以在每个Go协程中执行一个查询,这样它们就可以并行运行。它们可能会在不同的CPU核心上运行,但实际性能与此无关,因为每个查询本质上都没有做任何事情,只是等待数据库响应。但仍然可以提高性能。(为了完整起见,我要提一下,使用协程并不是并行运行数据库查询的唯一方式,但在Go语言中,这是惯用的方式,也是最容易的方式)。
  • 如果您有一些被HTTP请求触发的任务,但不影响HTTP响应,您可以将它们放在一个Go协程中运行,这样您的响应可以更快地返回。日志记录就是一个常见的例子。您可能希望记录HTTP请求,但如果记录器很慢,您可能不希望在发送HTTP响应之前等待记录完成。所以请使用协程来完成它。记录器可以慢慢地运行,即使客户端已经收到响应,也可以在稍后完成记录。发送电子邮件也是另一个例子,请不要等待电子邮件发送完成后再响应HTTP客户端。

  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接