[英]How can I orchestrate concurrent request-response flow?
我是并发编程的新手,也不知道从什么概念开始,所以请保持谨慎。
我正在编写一个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
http.Handler
类的操作来将queue<- request
添加到队列中, handleRequest
阻塞,等待通道有东西获取的handleRequest
,将简单地获取请求并继续。 完成后,循环结束,执行返回到request := <-queue
,并且同一件事继续进行。
我的问题始于http.Handler
。 将请求放入一个通道非常有意义,因为多个gorutine都在监听它。 但是,这些gorutines如何将结果返回到我的http.Handler
?
一种方法是使用一个通道,我们将其称为responseQueue
,然后所有这些gorutine将写入该通道。 问题是,当响应添加到通道时,我不知道它属于哪个请求。 换句话说,当多个http.Handler
发送请求时,每个执行处理程序将不知道该通道中的当前消息属于哪个响应。
是否有最佳实践或模式,将数据从另一个gorutine发送到gorutine并接收回数据?
创建每个请求响应通道,并将其包含在发送给工作程序的值中。 处理程序从通道接收。 工作人员将结果发送到通道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.