如何设定GoLang bufio的写作截止日期.作家



我在GoLang中使用buffio.Writer,如下所示。

conn, err := net.Dial("tcp", address) // address is of form ip:port
w := bufio.NewWriter(conn)
w.WriteByte(code) // code is a byte
w.Write(data) // data is a byte buffer
w.Flush()

我正在尝试修改上面的代码,以便write()事件有一个截止日期:当截止日期过去时,write()事件将返回,而不管它是否成功。

在GoLang中,如果conn(连接对象(直接用于使用conn.SetWriteDeadline(time.Now().Add(n * time.Second))进行写入,则可能有一个截止日期。然而,当我使用bufifo.writer对象时,它本质上是缓冲IO的conn的包装器,没有API来设置截止日期。

虽然可以使用conn.SetWriteDeadline(time.Now().Add(n * time.Second))conn.Write(b),但它的效率非常低,因为它没有缓冲write事件(因此有很多上下文切换(

在GoLang中,有没有一种方法可以将缓冲IO与writeDeadline()一起使用?

感谢

这里有两种情况需要注意。

如果您希望每个write()都有截止日期,那么就不可能使用缓冲。当使用缓冲时,当缓冲区已满时,会触发实际的write()。因此,从技术上讲,不可能知道您的write()何时完成。在这种情况下,您实际上使用的是conn.write(),您可以使用conn.SetWriteDeadline(time.Now().Add(n * time.Second))

在第二种情况下,正如@icza在评论中提到的,您可以在底层conn对象中设置截止日期,buffio.writer((包装器将遵守此规则。虽然这在语义上是正确的,但它并没有提供您想要的网络抽象。

最新更新