epoll整合的优势
Advantages of epoll integration
在一次工作面试中,我不得不回答这个问题——在 Go 中使用 epoll integration/implementation 你有哪些优势。
我只知道 epoll 可以做什么,任何描述符计数的复杂度都是 O(1),但不知道为什么 Go 比其他语言更好。
我找到了这个分支 https://news.ycombinator.com/item?id=15624586 并且有人说原因可能是 Go 不使用堆栈切换。这对我来说很难理解。程序的哪一部分不使用堆栈切换?每个 goroutine 都有自己的堆栈。
这并不是 netpoller 集成 本身 让 Go 在其领域变得强大——而是集成完成的方式:而不是作为一个库被固定,在Go,netpoller 紧密集成到 运行time 和调度器(它决定哪个 goroutine 运行,以及什么时候)。
超轻量级执行线程(goroutines)与 netpoller 的耦合允许 无回调 编程。也就是说,一旦您的服务连接到另一个客户端,您只需将此连接交给一个 goroutine,该 goroutine 仅从中读取数据(并将其响应流写入其中)。一旦 goroutine 想要读取数据时没有可用数据,调度程序就会挂起 goroutine 并在 netpoller 报告有数据可用时解除阻塞;当 goroutine 想要写入数据但发送缓冲区已满时也会发生同样的情况。
回顾一下,Go 中的 netpoller 与 goroutine 调度器交织在一起,它允许 goroutine 透明地等待数据可用性,而不需要程序员显式编写事件循环和回调代码或处理 "futures" 和 "promises" 这仅仅是包装在漂亮对象中的回调。
我邀请你阅读this classic essay,它用更漂亮的文字解释了这些东西。
在一次工作面试中,我不得不回答这个问题——在 Go 中使用 epoll integration/implementation 你有哪些优势。
我只知道 epoll 可以做什么,任何描述符计数的复杂度都是 O(1),但不知道为什么 Go 比其他语言更好。
我找到了这个分支 https://news.ycombinator.com/item?id=15624586 并且有人说原因可能是 Go 不使用堆栈切换。这对我来说很难理解。程序的哪一部分不使用堆栈切换?每个 goroutine 都有自己的堆栈。
这并不是 netpoller 集成 本身 让 Go 在其领域变得强大——而是集成完成的方式:而不是作为一个库被固定,在Go,netpoller 紧密集成到 运行time 和调度器(它决定哪个 goroutine 运行,以及什么时候)。
超轻量级执行线程(goroutines)与 netpoller 的耦合允许 无回调 编程。也就是说,一旦您的服务连接到另一个客户端,您只需将此连接交给一个 goroutine,该 goroutine 仅从中读取数据(并将其响应流写入其中)。一旦 goroutine 想要读取数据时没有可用数据,调度程序就会挂起 goroutine 并在 netpoller 报告有数据可用时解除阻塞;当 goroutine 想要写入数据但发送缓冲区已满时也会发生同样的情况。
回顾一下,Go 中的 netpoller 与 goroutine 调度器交织在一起,它允许 goroutine 透明地等待数据可用性,而不需要程序员显式编写事件循环和回调代码或处理 "futures" 和 "promises" 这仅仅是包装在漂亮对象中的回调。
我邀请你阅读this classic essay,它用更漂亮的文字解释了这些东西。