乐闻世界logo
搜索文章和话题

Golang 中的线程是什么?

1 个月前提问
1 个月前修改
浏览次数9

1个答案

1

在 Golang 中,并没有直接被称为“线程”的概念。Golang 使用的是称为“goroutines”的轻量级线程,它们是在 Go 运行时环境中被调度的。goroutines 比系统线程占用更少的内存资源,且在创建和销毁时的开销较小。

Goroutines 的特点:

  1. 轻量级:每个 goroutine 在堆栈上只需要几千字节的内存,因此可以轻松创建成千上万个 goroutine。
  2. 非阻塞式设计:goroutines 在执行 I/O 操作(如读写文件、请求网络等)时不会阻塞其他 goroutines 的执行。
  3. 动态堆栈:Go 的运行时会自动增长或缩减 goroutine 的堆栈大小,这意味着开发者不必担心堆栈溢出问题。
  4. 并发非并行:默认情况下,Go 会使用 CPU 核心数相等数量的系统线程来运行所有的 goroutines。这意味着在单核 CPU 上,即使有多个 goroutines,也只能实现并发执行(轮流分时间片执行),而在多核 CPU 上则可以实现真正的并行执行。

示例:

假设我们需要编写一个程序,该程序需要从三个不同的网络服务分别获取数据。使用 goroutines,我们可以并发地从这三个服务获取数据,每个服务的请求可以使用一个单独的 goroutine 来处理,从而大大提高程序的效率。

go
package main import ( "fmt" "net/http" "time" ) func fetchService(url string, ch chan<- string) { start := time.Now() resp, err := http.Get(url) if err != nil { ch <- fmt.Sprintf("Error fetching from %s: %v", url, err) return } defer resp.Body.Close() elapsed := time.Since(start).Seconds() ch <- fmt.Sprintf("Fetched from %s in %.2f seconds", url, elapsed) } func main() { urls := []string{ "http://example.com/service1", "http://example.com/service2", "http://example.com/service3", } ch := make(chan string) for _, url := range urls { go fetchService(url, ch) } for range urls { fmt.Println(<-ch) } }

在这个例子中,我们为每个网络服务的请求创建了一个 goroutine。这些 goroutines 都可以并行地执行(在多核处理器上),每个请求的处理时间将大幅减少,从而提高了整体的程序性能。

2024年8月7日 21:46 回复

你的答案