gpt4 book ai didi

go - 如何编排并发请求-响应流程?

转载 作者:数据小太阳 更新时间:2023-10-29 03:16:11 26 4
gpt4 key购买 nike

我是并发编程的新手,不知道从什么概念开始,所以请保持温和。

我正在编写一个网络服务作为 TCP 服务器的前端。这个服务器监听我给它的端口,并为每个请求返回对 TCP 连接的响应。

这就是我为此服务器编写 Web 服务前端的原因:

  • 服务器一次可以处理一个请求,我试图通过启动多个进程并为它们提供不同的端口来监听,使其能够同时处理多个输入。例如,我想启动 30 个实例并告诉它们监听端口 20000-20029。
  • 我们的团队使用 PHP,而 PHP 没有能力启动服务器实例并同时维护它们,所以我正在尝试编写一个 API,他们只能向其发送 HTTP 请求。

所以,这是我想到的结构。

  1. 我会有一个main()功能。此函数同时启动进程,然后在端口 80 上启动 HTTP 服务器并进行监听。
  2. 我有一个 http.Handler将请求的内容添加到 channel 。
  3. 我会有 gorutine,每个服务器实例一个,处于无限循环中。

第三项中提到的函数的代码应该是这样的:

func handleRequest(queue chan string) {
for {
request := <-queue
conn, err := connectToServer()
err = sendRequestToServer(conn)
response, err := readResponseFromServer(conn)
}
}

所以,我的 http.Handler可以简单地做类似 queue<- request 的事情将请求添加到队列中,handleRequest ,它已经阻塞,等待 channel 有东西要获取,将简单地获取请求并继续。完成后,循环结束,执行返回到 request := <-queue ,同样的事情继续。

我的问题始于 http.Handler .将请求放在一个 channel 中是非常有意义的,因为多个 gorutine 都在监听它。但是,这些 gorutine 如何将结果返回给我的 http.Handler

一种方法是使用 channel ,我们称它为responseQueue ,然后所有这些 gorutine 都会写入。问题是当一个响应被添加到 channel 时,我不知道它属于哪个请求。换句话说,当多个 http.Handler s 发送请求,每个正在执行的处理程序都不知道 channel 中的当前消息属于哪个响应。

是否有最佳实践或模式将数据从另一个 gorutine 发送到 gorutine 并接收回数据?

最佳答案

为每个请求创建一个响应 channel ,并将其包含在发送给工作人员的值中。处理程序从 channel 接收。 worker 将结果发送到 channel 。

关于go - 如何编排并发请求-响应流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34718430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com