gpt4 book ai didi

go - goroutine 上的 IO 回调

转载 作者:行者123 更新时间:2023-12-01 22:45:35 24 4
gpt4 key购买 nike

我是golang的初学者。查看所有 golang 教程,看起来您应该为所有内容创建 goroutine。来自 C 中的 libuv 之类的东西,您可以在其中为单个线程上的套接字读/写定义回调,这是在 golang 中为所需的任何 IO 任务创建嵌套 goroutine 的正确方法吗?

举个例子,像 nginx 这样一个线程将处理多个连接。要在 golang 中做类似的事情,我们需要一个 goroutine 来处理每个连接吗?

最佳答案

Go 在编写网络服务的工具领域特别突出,因为它在运行时调度程序中集成了 I/O 感知功能,为任何正在运行的 GO 程序提供支持。

基本思想大致是这样的:goroutine 在套接字上执行正常的、顺序的、无回调的操作——即普通的读取和普通的写入——并且只要下一个 I/O 操作阻塞(是的,相关的系统调用在类 Unix 内核上返回 EWOULDBLOCK ),goroutine 被挂起,它的套接字被分发到运行时的一个名为“netpoller”的组件中,该组件使用平台原生套接字 I/O 多路复用器实现,例如 epollkqueue 或IOCP,并且运行 goroutine 的操作系统线程被移交给另一个想要运行的 goroutine。一旦 netpoller 发出信号,socket 上的 I/O 导致 goroutine 暂停可以继续,调度程序将该 goroutine 排队等待执行,然后它继续在它停止的地方运行。

正因为如此,在 Go 中编写网络服务时采用的常用模型是每个套接字有一个 goroutine。当您编写普通的 TCP 服务器时,您应该自己创建一个 goroutine(并在它接受客户端连接后将监听器返回的套接字交给它)。net/http.Server 内置了这种行为,因为它创建了一个 goroutine 来服务每个传入的客户端请求(实际上,对于 HTTP/1.x,每个连接创建两个甚至三个 goroutine,但它对 HTTP 请求处理程序不可见)。

现在,我们刚刚介绍了基础知识。当然,可能有正当理由需要额外的 goroutine 来处理完成请求所需执行的任务,这就是 @Volker 所指的。

更多信息:

  • "What color is your function?" — 一篇经典的文章,处理作为库实现的 I/O 多路复用与在核心中实现的对比。
  • "Go's work-stealing scheduler";另见 thisthisthis design doc
  • State threads library 实现的方法与 Go 的方法非常相似,只是级别要低得多。它的文档对 Go 中实现的方法非常有见地。
    libtask 是最近的一次尝试
    同样的问题,由 Go 的一位创造者提出。
  • 关于go - goroutine 上的 IO 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62339333/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com