为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine 上的 IO 回调

goroutine 上的 IO 回调

Go
回首忆惘然 2022-06-13 10:15:06
我是golang的初学者。查看所有 golang 教程,看起来您应该为所有内容创建 goroutine。来自 C 中的 libuv 之类的东西,您可以在其中为单个线程上的套接字读/写定义回调,这是在 golang 中为所需的任何 IO 任务创建嵌套 goroutine 的正确方法吗?举个例子,像 nginx 这样一个线程将处理多个连接。要在 golang 中做类似的事情,我们需要一个 goroutine 来处理每个连接吗?
查看完整描述

1 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

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

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

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

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


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信