如何在net.Conn上执行非阻塞写操作?

时间:2017-05-26 19:53:36

标签: networking go nonblocking

如何在Go?

中对网络连接执行非阻塞写入

我认为通过设定过去的截止日期可能会这样做:

conn.SetWriteDeadline(time.Date(0, 0, 0, 0, 0, 0, 1, time.UTC))
n, err := conn.Write(buffer)

...但是这只是因为“i / o超时”而失败了。没有实际写任何字节到连接的错误。

1 个答案:

答案 0 :(得分:3)

在Go中,您使用阻塞I / O,运行时将其“转换”为非阻塞I / O:从套接字读取时阻塞的goroutine将由调度程序与另一个goroutine交换,准备继续执行。

因此,你可以获得两全其美:更容易遵循的代码(例如,没有回调地狱)非阻塞I / O的效率(即epoll,kqueue,完成)端口)。

<强>更新

  

@cpcallen 我需要能够以这样的方式写入套接字,以确保执行写操作的线程不会阻塞。

如果通过“thread”引用OS级别的线程,则不会阻止它。如果通过“线程”你指的是执行写入的goroutine,那还不可能,但有一个提案:https://github.com/golang/go/issues/15735