go - 允许在 net.Conn 和频道上选择 Go Routine 的方法?
问题描述
我觉得这一定是一种常见的 Go 模式,但似乎找不到解决方案。
假设有一个 Go 应用程序正在建立出站 TCP 连接。我将使用net.Dial
并在连接后生成一个 Go 例程来处理套接字 ( net.Conn
)。这是非常简单和常见的。我想弄清楚的是,让这个 Go 例程有一个通道,它正在读取和写入来自这个套接字的消息的最佳方法是什么?select
only 能够在频道上等待,而不是net.Conn
. 我是否轮询套接字以获取数据,然后检查通道以获取数据?这似乎非常低效。
解决方案
这个问题的一个常见解决方案是创建两个 goroutine:一个从套接字读取并写入通道,另一个从通道读取并写入套接字。从套接字读取的 goroutine 应该在套接字关闭时终止,并向另一个 goroutine 发出信号(通过取消上下文或关闭通道),使其停止在通道上等待。
推荐阅读
- node.js - 无法为 Laravel 5.6 安装 npm dev / npm watch
- laravel - 在 vue 模板的列表中分组后显示获取的数据
- azure-machine-learning-service - AML run.log() 和 run.log_list() 失败且没有错误
- laravel - 如何从 laravel 的 mysql 数据库中的列中减去一分钟?
- ruby-on-rails - 部署在 Heroku 上的 Rails 6 不会更新样式表
- c++ - 使用 bazel 构建 Makefile
- node.js - PM2 集群中的 Websockets,在生产中好吗?
- python - 'TypeError: 'numpy.ndarray' object is not callable' 是什么意思?
- azure - 如何在使用 Azure cloudshell 克隆 Web 应用程序时修复“与现有主机名的冲突”
- jquery - 使用 jQuery 嵌套动态表单