MST

星途 面试题库

面试题:Go中调度器如何实现基本的并发任务管理

在Go语言中,简述调度器是怎样对多个并发任务进行基本管理的,比如任务的创建、排队与执行顺序等方面。同时,请给出一个简单示例代码,展示使用调度器执行两个并发任务。
24.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

调度器对并发任务的基本管理

  1. 任务创建:在Go语言中,通过go关键字创建并发任务(goroutine)。例如go func() { /* 任务逻辑 */ }(),这会将一个函数调用封装成一个独立的执行单元,即goroutine,交给Go调度器管理。
  2. 排队:Go调度器使用M:N调度模型。它有多个M(操作系统线程)和多个N(goroutine)。调度器维护多个本地队列(每个M有一个本地队列)和一个全局队列。当创建一个goroutine时,它优先被放入当前M对应的本地队列。如果本地队列已满,则放入全局队列。
  3. 执行顺序:调度器采用协作式调度。M从本地队列获取goroutine来执行。如果本地队列为空,M会尝试从全局队列获取任务,或者从其他M的本地队列偷取任务(work - stealing机制)。在执行过程中,当一个goroutine执行了像I/O操作、系统调用、time.Sleep、channel操作等可能导致阻塞的操作时,它会主动让出M,调度器会安排其他可运行的goroutine在这个M上执行。

示例代码

package main

import (
    "fmt"
)

func task1() {
    fmt.Println("Task 1 is running")
}

func task2() {
    fmt.Println("Task 2 is running")
}

func main() {
    go task1()
    go task2()

    // 防止主线程退出,以便goroutine有机会执行
    select {}
}