为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕桂英3389331 2021-12-07 10:03:20
我是并发编程的新手,不知道从什么概念开始,所以请保持温和。我正在编写一个 web 服务作为 TCP 服务器的前端。该服务器侦听我给它的端口,并将响应返回给每个请求的 TCP 连接。这就是我为此服务器编写 Web 服务前端的原因:服务器一次可以处理一个请求,我试图通过启动多个进程并为它们提供不同的端口来侦听,从而使其能够同时处理多个输入。例如,我想启动 30 个实例并告诉它们侦听端口 20000-20029。我们的团队使用 PHP,而 PHP 没有能力启动服务器实例并同时维护它们,所以我正在尝试编写一个 API,它们只能向其发送 HTTP 请求。所以,这是我想到的结构。我会有一个main()功能。此函数同时启动进程,然后在端口 80 上启动 HTTP 服务器并进行侦听。我有一个http.Handler将请求的内容添加到频道的。我将有 gorutines,每个服务器实例一个,处于无限循环中。第 3 项中提到的函数的代码将是这样的: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 如何将结果返回给 my http.Handler?一种方法是使用一个通道,我们称之为responseQueue,然后所有这些 gorutines 将写入。问题是,当一个响应添加到通道时,我不知道它属于哪个请求。换句话说,当多个http.Handlers 发送请求时,每个正在执行的处理程序将不知道通道中的当前消息属于哪个响应。是否有最佳实践或模式将数据从另一个 gorutine 发送到 gorutine 并接收回数据?
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信