当前位置: 首页 > 面试题库 >

Web服务器请求会生成自己的goroutine吗?

祁嘉瑞
2023-03-14
问题内容

我想知道goroutine和go网络服务器在请求进入时如何工作:

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

在这段代码中

  1. 每次/致电的请求handler。这是否意味着每个请求都会生成自己的goroutine?或者它派生自己的process还是thread?是否有任何文档说明这些请求如何获得自己的goroutine?

  2. 其他语言如何处理此请求?例如,Python flask是否为每个请求启动自己的进程?

谢谢,


问题答案:

net/http根据http://golang.org/pkg/net/http/#Server.Serve的文档,Go的HTTP服务器(中的)会按请求为每个请求生成一个goroutine(不是线程)-

服务在侦听器l上接受传入连接,为每个连接创建一个新的服务goroutine。服务goroutine读取请求,然后调用srv.Handler对其进行回复。

其他语言可以通过多种方式处理此问题,包括:

  • 基于事件的架构ala node.js 1和
  • 多个进程和/或线程(或两者),其中“管理器”根据正在阻止的(和没有阻止的)在活动线程之间切换

我建议阅读https://www.digitalocean.com/community/tutorials/a-comparison-of-rack-
web-servers-for-ruby-web-
applications

,以了解一些Ruby
Web服务器的工作方式示例事物(包括上述方法),以及适用于Python的https://www.digitalocean.com/community/tutorials/a-comparison-
of-web-servers-for-python-based-web-
applications,其中应包括洞察力。



 类似资料:
  • 我最近一直在用Java编写自己的Webserver,因为我觉得有一个很不错,昨天我偶然发现了一个问题,我仍然没有解决。我的浏览器(取消搜索Chromium)似乎向服务器发送了一些空请求或类似的东西。我实现了一个请求处理程序,它应该读取GET请求并提取请求的资源。它的工作原理是这样的:它以请求为例:“GET/index.htmlHTTP/1.1”并将其放入带有String.split (" ");

  • 问题内容: 我已经尝试解决一个奇怪的问题了一段时间了。在浏览了许多棱角分明的代码之后,当我通过Charles将请求记录到服务器时,我注意到了一些奇怪的东西。 当我发布到url时,请求实际上不会到达我的服务器。相反,它收到301响应,然后GET请求命中了我的服务器。 这令人难以置信。还有其他人遇到这个问题吗?如果您有兴趣,我已经上传了我的Charles日志的屏幕截图。 作为参考,这是我的服务器的外观

  • 我正在使用openapi生成器maven插件的4.3.1版本在Java11中生成SpringBoot服务器。 对于PUT请求,我希望能够在成功时将URI返回到创建/更新的对象,并且在不成功时返回带有问题信息的纯文本。 我的API的json对于PUT请求有以下内容: 生成的API: 然而,该方法的返回类型是

  • 问题内容: 这似乎是一个黑洞:经过一个小时的搜索jQuery UI网站,Stack Overflow和谷歌搜索,我还没有找到有关如何编写AutoComplete 服务器端 的最基本信息。 什么参数传递给服务器,JSON响应应该是什么样? 我一定想念一些东西,因为其他人怎么学到的呢?网站似乎只讨论客户端JavaScript代码,而没有讨论协议或服务器端示例。 我需要足够的资源来使最简单的远程示例正常

  • 获取未定义id的错误。如果我使用,它工作得很好。这是客户端代码: 下面是我自己的代码: 我做错了什么? 如果我使用以下代码:

  • 在行引发异常: 线程“main”javax.net.ssl.SSLHandShaker异常:Sun.Security.Validator.ValidatoreXception:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:无法在Sun.Security.SSL.Alerts.GetSleXception(