【发布时间】:2017-03-25 23:30:20
【问题描述】:
我们正在使用 gorilla mux 框架来处理 Web 请求,我想这些请求会自动在所有 cpu 内核上运行。在这种情况下使用 goroutine 对 cpu 密集型进程(例如循环一个大对象)有好处吗?
【问题讨论】:
-
Alexander R 好久没用了,不用设置gomaxprocs了。
我们正在使用 gorilla mux 框架来处理 Web 请求,我想这些请求会自动在所有 cpu 内核上运行。在这种情况下使用 goroutine 对 cpu 密集型进程(例如循环一个大对象)有好处吗?
【问题讨论】:
我想自动在所有 cpu 内核上运行。
你猜错了。有点像。
从 Go 1.5 开始,Go 将通过在不同内核上运行 go 例程来使用您的所有内核。但是如果你不使用 goroutine,它就没有办法利用这一点。
在这种 cpu 密集型进程(例如循环大型对象)的情况下使用 go 例程是否有好处?
可以的。但你问错问题了。
您不会使用 Go 例程主要是为了利用不同的 CPU 内核(尽管这也可能是一个好处)。您可以使用 Go 例程来防止程序在执行需要一段时间的操作时阻塞。
对于 Web 应用程序,大多数请求通常根本不是 CPU 密集型的。但他们通常会花费大量时间(以计算机术语)等待事情发生。它们等待对请求主机名的 DNS 查找,它们等待数据库查找用户凭据以建立会话,它们等待数据库存储或返回行以产生 HTTP 响应,等等。
如果没有 go 例程,在执行这些操作时,您的服务器将无法执行其他任何操作。因此,如果您的典型 HTTP 请求需要 1 秒来查找 DNS、验证授权 cookie、从数据库中查找结果并发送响应,则无法同时为其他 HTTP 客户端提供服务。
幸运的是,Gorilla(以及几乎所有其他 Go 网络框架)使用的 http 包已经使用 Go 例程来处理请求。因此,您已经(至少)为每个 HTTP 请求使用了一个 Go 例程。
使用额外的 go 例程是否有意义取决于您的应用程序设计,而不是“使用更多的 CPU 内核”。
一些建议:
【讨论】: