了解web API的goroutines

了解web API的goroutines,go,Go,刚从Go开始,希望创建一个简单的Web API。我正在研究使用gorillamux()来处理web请求 我不知道如何最好地使用Go的并发选项来处理请求。我是否在某个地方读到main函数实际上是一个goroutine,或者我应该在收到每个请求时将它们发送给goroutine?如果我“太离谱了”,我会道歉。我会提供一个答案,尽管我投票决定以过于宽泛的方式结束 无论如何,这些都不是真正必要的。你想得太多了。如果你没有读过这篇文章,它看起来像是一个不错的教程 您可以像使用大多数典型的rest框架一样设置

刚从Go开始,希望创建一个简单的Web API。我正在研究使用gorillamux()来处理web请求


我不知道如何最好地使用Go的并发选项来处理请求。我是否在某个地方读到
main
函数实际上是一个goroutine,或者我应该在收到每个请求时将它们发送给goroutine?如果我“太离谱了”,我会道歉。

我会提供一个答案,尽管我投票决定以过于宽泛的方式结束

无论如何,这些都不是真正必要的。你想得太多了。如果你没有读过这篇文章,它看起来像是一个不错的教程


您可以像使用大多数典型的rest框架一样设置路由,让Web服务器/框架在请求处理级别担心并发性。您只需要使用goroutines来生成请求的响应,例如,如果您需要从一个文件夹中的10个文件中聚合数据。这是一个人为的示例,但在这里,您可以为每个文件派生一个goroutine,通过在非阻塞选择中读取通道来聚合所有信息,然后返回结果。您可以期望以异步、非阻塞的方式调用代码的所有入口点,如果这样做有意义的话…

假设您使用的是Go的
http.listendServe
来服务您的http请求,文档中明确说明每个传入连接都由单独的goroutine为您处理。 您通常会从
main
函数调用
listendandserve

Gorilla mux只是一个比http.DefaultServeMux更灵活地将请求路由到处理程序的包。它实际上并不处理传入的连接或请求,只是简单地将其转发给处理程序


我强烈建议您阅读一些文档,特别是关于编写web应用程序的指南。

您并不真正需要web服务的例程。这些库本身已经能够单独处理请求。您只需担心处理调用的效率,而库只会处理其余的调用。整个
net
机制基本上都是这样工作的。这主要是为什么Go如此令人敬畏,提供了开箱即用的令人敬畏的特性。谢谢-但我假设如果在处理程序中我需要从数据库中获取数据,那么这可以/应该通过goroutine完成?没有更好的mysql库(或任何其他流行的库)也通过相同的逻辑处理它们的调用。您不需要像在Objective-C/C/C++中使用SQlite3之类的库时那样启动高级队列。同样如此;只需关注代码的轻量级。这些图书馆已经非常棒了:Dwow-听起来太棒了,不可能是真的哈,哈耶普!在我5岁的MacBookPro上,我通过tiedot数据库发出了数以万计的请求。无论你来自哪种语言,这都是一种解脱。当您的文件甚至不到200行时,您几乎无法相信您的代码已经完成。这就是我爱上Go的原因:)一分钟也不担心线程或开销。调整在Go中也非常容易,在其他语言中,后期优化是*ss中最大的痛苦。正如Rob Pike反复指出的那样,你也需要感到厌倦,即使groroutines非常便宜,你也不应该过度使用它们并看到它们的实际使用情况。老实说,;当我不做任何双向的事情(比如聊天或实时反馈系统)时,我从不使用goroutines。我更喜欢在偶然的事情需要某种形式的负载分布时使用它们作为最后的手段(这可能还包括一些库,它们往往不会最有效地使用cpu周期;让它们并行运行,而不是串联运行)。@Allendar我确实注意到了这篇博文,尽管这篇博文建议在MongoDB中使用goroutines(我可能会使用):因为NoSQL系统不像RDBMS那样受到锁的影响。快速浏览那篇文章,它们似乎使用例程将任务生成到数据库中,而无需等待直接确认。当您不关心结果时,这可能很方便。我在为商店下单时通常会做类似的事情。告诉客户即可你完成了,当一切都处理完毕后,他们会收到一封邮件。当例行程序得到支付提供商的确认后,它会将邮件发送给客户。这对客户来说感觉非常流畅,因为主流程不必等待。@tommyd456我没有真正看这个示例,但如果您必须聚合结果,这是有意义的如果我必须从多个集合中获取对象并合并它们,那么只有在工作实际上可以分割的情况下使用goroutines才有意义(忽略它对Mongo的使用不好,可能只应该使用SQL)在内存中分发一些工作可能是一个很好的用途。但是,这些例程将用于单个请求,而不是在请求处理程序级别。它实际上与我的文件示例没有什么不同,只是存储区是Mongo。