我们正在使用gorilla mux框架来处理Web请求,我想这些请求会自动在所有cpu核心上运行。在这种情况下使用go例程是否有益于cpu密集型进程,例如循环遍历大型对象?
答案 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内核。”
一些建议: