我是并发编程的新手,并且不知道从哪个概念开始,所以请保持温和。
我正在编写一个Web服务作为TCP服务器的前端。此服务器侦听我提供的端口,并为每个请求返回TCP连接的响应。
这就是我为此服务器编写Web服务前端的原因:
所以,这是我想到的结构。
main()
功能。此函数同时启动进程,然后在端口80上启动HTTP服务器并侦听。http.Handler
,它将请求的内容添加到频道中。第三项中提到的功能代码如下:
func handleRequest(queue chan string) {
for {
request := <-queue
conn, err := connectToServer()
err = sendRequestToServer(conn)
response, err := readResponseFromServer(conn)
}
}
因此,我的http.Handler
可以简单地执行类似queue<- request
的操作,将请求添加到队列中,handleRequest
已阻止,等待频道获取内容,将简单地得到请求并继续。完成后,循环结束,执行返回request := <-queue
,同样的事情继续。
我的问题始于http.Handler
。将请求放入通道是完全合理的,因为多个gorutine都在监听它。但是,这些gorutines如何将结果返回到我的http.Handler
?
一种方法是使用频道,让我们称之为responseQueue
,然后所有这些gorutine都会写入。问题是当响应被添加到频道时,我不知道它属于哪个请求。换句话说,当多个http.Handler
发送请求时,每个执行处理程序将不知道通道中当前消息属于哪个响应。
是否有最佳做法或模式将数据从另一个gorutine发送到gorutine并接收数据?
答案 0 :(得分:1)
创建每个请求响应通道,并将其包含在发送给worker的值中。处理程序从通道接收。工作人员将结果发送到频道。