1 回答

TA贡献1853条经验 获得超9个赞
并发是 Go 的主要优势之一。这并不意味着 Go 运行时可以神奇地解决所有问题和案例,并使您的所有代码闪电般快速。你可以用任何语言编写糟糕的代码。但是并发是内置在语言中的。它为您提供了几种语言工具,意味着轻松编写高效的并发代码,例如 goroutines、channels、select
statement、同步原语。
goroutine 是一个轻量级线程。它比真正的 OS 线程成本低很多,并且多个 goroutine 可以多路复用到单个 OS 线程上。规范将它们定义为“同一地址空间内的独立并发控制线程”。
Go 运行时能够毫无问题地处理数千甚至数十万个 goroutine。例如,标准库中的HTTP 服务器通过为每个请求启动一个新的 goroutine 来处理所有传入请求。然而,对于典型的请求负载(基准源),它每秒能够处理数万个请求。
所以总而言之,不要写“坏代码”。goroutine 调度程序不是(完全)抢占式的,因此请确保您的 goroutines 不会进行会阻止调度程序运行其他 goroutines 的无意义计算。通常,系统调用、IO 操作符和阻塞操作(例如从通道发送/接收)是很好的屈服点。即使您不知道,许多代码也会在后台执行这些操作,因此大多数代码不会引起问题。如果您的某个 goroutine 必须进行大量计算,您可以随时调用runtime.Gosched()
以让处理器,允许其他 goroutine 运行。
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报