【问题标题】:Advantages of epoll integrationepoll集成的优势
【发布时间】:2019-11-11 20:48:13
【问题描述】:

在一次工作面试中,我必须回答这个问题 - 由于在 Go 中使用 epoll 集成/实现,您有哪些优势。

我只知道 epoll 可以做什么,任何描述符计数的复杂度都是 O(1),但不知道为什么 Go 比其他语言更好。

我找到了这个分支https://news.ycombinator.com/item?id=15624586 并且有人说可能是因为 Go 不使用堆栈切换。这对我来说很难理解。程序的哪一部分不使用堆栈切换?每个 goroutine 都有自己的堆栈。

【问题讨论】:

  • 那条评论指的是单线程用例,在这种情况下没有堆栈切换,因为只有一个 goroutine(没有什么可以切换的)。

标签: performance go epoll


【解决方案1】:

这不是 netpoller 集成 本身 让 Go 在其领域中强大 - 而是集成完成的方式:在 Go 中,netpoller 不是作为一个库被螺栓固定的,而是紧密集成到运行时和调度程序(决定运行哪个 goroutine 以及何时运行)。

超轻量级执行线程(goroutines)与 netpoller 的耦合允许无回调编程。也就是说,一旦您的服务连接了另一个客户端,您只需将此连接交给一个 goroutine,后者仅从中读取数据(并将其响应流写入它)。当 goroutine 想要读取它时,一旦没有可用数据,调度程序就会暂停 goroutine 并在 netpoller 报告有可用数据时解除阻塞;当 goroutine 想要写入数据但发送缓冲区已满时,也会发生同样的情况。

回顾一下,Go 中的 netpoller 与 goroutine 调度程序交织在一起,它允许 goroutine 透明地等待数据可用性,而无需程序员显式编写事件循环和回调或处理仅仅是回调的“futures”和“promises”包裹在漂亮的物体中。

我邀请您阅读this classic essay,它用更优美的文字解释了这些东西。

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2014-04-05
    相关资源
    最近更新 更多