一架梯子,一头程序猿,仰望星空!
Golang初级特性面试题 > 内容正文

Go语言的并发模型是什么?


问题简答

Go语言的并发模型是基于 Goroutine 和 Channel 的。Goroutine 是 Go 语言提供的轻量级线程实现,它比线程更加轻便,启动和结束更加快速。 Channel 是一种通信机制,用于在 Goroutine 之间传递数据,并发地安全地执行协同任务。

问题详解:

下面是Go Goroutine(协程 ) 和 Channel 的简单例子

package main

import (
    "fmt"
    "time"
)

// worker 函数是一个工作协程,它接收一个工作任务列表和结果列表
// id表示工作协程的编号,jobs表示工作任务列表,results表示结果列表
func worker(id int, jobs <-chan int, results chan<- int) {
    // 循环遍历从jobs中读取到的任务
    for job := range jobs {
        fmt.Printf("工作协程%d正在处理任务%d\n", id, job)
        time.Sleep(time.Second) // 模拟工作耗时
        results <- job * 2 // 将结果写入results列表
    }
}

func main() {
    jobs := make(chan int, 100)   // 创建一个可以存储100个整数的工作任务列表
    results := make(chan int, 100) // 创建一个可以存储100个整数的结果列表

    // 创建三个工作协程
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // 向工作任务列表中写入5个任务
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs) // 关闭工作任务列表

    // 从结果列表中读取5个结果并输出
    for a := 1; a <= 5; a++ {
        result := <-results
        fmt.Println("结果:", result)
    }
}