如何在Go?
中对网络连接执行非阻塞写入我认为通过设定过去的截止日期可能会这样做:
conn.SetWriteDeadline(time.Date(0, 0, 0, 0, 0, 0, 1, time.UTC))
n, err := conn.Write(buffer)
...但是这只是因为“i / o超时”而失败了。没有实际写任何字节到连接的错误。
答案 0 :(得分:3)
在Go中,您使用阻塞I / O,运行时将其“转换”为非阻塞I / O:从套接字读取时阻塞的goroutine将由调度程序与另一个goroutine交换,准备继续执行。
因此,你可以获得两全其美:更容易遵循的代码(例如,没有回调地狱)和非阻塞I / O的效率(即epoll,kqueue,完成)端口)。
<强>更新强>
@cpcallen 我需要能够以这样的方式写入套接字,以确保执行写操作的线程不会阻塞。
如果通过“thread”引用OS级别的线程,则不会阻止它。如果通过“线程”你指的是执行写入的goroutine,那还不可能,但有一个提案:https://github.com/golang/go/issues/15735