gpt4 book ai didi

io - 中止来自另一个 goroutine 的 Read() 调用

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

我在 IMAP 服务器上工作,其中一项操作是升级连接以使用 TLS(通过 STARTTLS 命令)。我们当前的架构有一个 goroutine 从套接字读取数据,解析命令,然后通过 channel 发送逻辑命令。另一个 goroutine 从该 channel 读取并执行命令。这在一般情况下效果很好。

但是,在执行 STARTTLS 时,我们需要停止当前正在进行的 Read() 调用,否则 Read() 将使用来自 TLS 握手的字节。我们可以在两者之间插入另一个类,但是那个类将在 Read() 调用中被阻塞,我们遇到了同样的问题。如果网络连接是一个 channel ,我们可以添加另一个信号 channel 并使用 select{} block 来停止读取,但网络连接不是 channel (只需将其包装在 goroutine 和 channel 中即可将问题移至该协程)。

有没有什么方法可以在 Read() 调用开始后停止它,而不用等待超时到期或类似的事情发生?

最佳答案

Read() 调用依赖于您的操作系统行为。它的行为依赖于套接字行为。

如果您熟悉 socket 接口(interface)(这几乎是操作系统之间的标准,但有一些细微差别),您会发现使用 socket 的同步通信模式,read 系统调用总是阻塞线程的执行直到超时值到期,并且您无法更改此行为。

Go 在底层使用同步 I/O 来满足它的所有需求,因为 goroutines 在设计上不需要异步通信。

还有一种方法可以中断 read:通过手动关闭套接字,这不是代码的最佳设计决策,而且在您的特定情况下。所以我认为你最好使用更小的超时,或者重新设计你的代码以其他方式工作。

关于io - 中止来自另一个 goroutine 的 Read() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17913645/

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