主页

go - goroutine 的使用

2025-07-23 09:25AM

Go 的并发哲学:"Do not communicate by sharing memory; instead, share memory by communicating." (通过通信共享内存,而非通过共享内存进行通信)

在go语言中,goroutine是实现并发的核心特性,它是轻量级的执行线程,由go运行时管理

并发模型:

通过go的关键字启动:go funcName()

非阻塞式启动,立即返回主线程

与channel配合实现通信(而非共享内存)

调度机制:

基于GMP模型(Goroutine,Machine,Processor)

工作窃取(Work-stealing)算法自动负载均衡

非抢占式协作调度(1.14+ 支持部分抢占)

eg:

package main

import "fmt"

// 一个整数切片values和一个用于发送结果的通道resultChan(只发送int类型)
func sum(values []int, resultChan chan int) {
  sum :=0
  for _, value := range values {
    sum += value
  }
  resultChan <- sum // 将计算结果发送到channel中
}

func main() {
  values := []int{1,2,3,4,5,6,7,9,10}
  resultChan := make(chan int, 2)  // 缓冲通道
  
  // 启动两个 goroutine 并行计算
  go sum(values[:4], resultChan)  // [1,2,3,4]
  go sum(values[4:], resultChan)  // [5,6,7,9,10]
  
  // 等待结果(阻塞直到收到两个结果)
  sum1, sum2 := <-resultChan, <-resultChan 
  fmt.Println("Result:", sum1, sum2, sum1+sum2)
}

 执行流程:

 

返回>>

登录

请登录后再发表评论。

评论列表:

目前还没有人发表评论