MST
星途 面试题库

面试题:Go中Future模式如何控制并发任务的执行顺序

在Go语言的Future模式场景下,假设你有三个并发任务A、B、C,要求任务B必须在任务A完成后执行,任务C可以在任务A执行过程中并发执行。请描述如何通过Future模式来实现这种执行顺序控制,并简单写出关键代码。
29.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用Go语言的通道(channel)来实现任务间的同步。
  2. 启动任务A,任务A完成后向一个通道发送信号。
  3. 任务B在接收到任务A完成的信号后开始执行。
  4. 任务C可以与任务A并发执行,无需等待任务A完成。

关键代码

package main

import (
    "fmt"
    "time"
)

func taskA(done chan struct{}) {
    fmt.Println("Task A started")
    time.Sleep(2 * time.Second) // 模拟任务A执行
    fmt.Println("Task A finished")
    close(done) // 任务A完成,关闭通道
}

func taskB(done <-chan struct{}) {
    <-done // 等待任务A完成的信号
    fmt.Println("Task B started")
    time.Sleep(1 * time.Second) // 模拟任务B执行
    fmt.Println("Task B finished")
}

func taskC() {
    fmt.Println("Task C started")
    time.Sleep(3 * time.Second) // 模拟任务C执行
    fmt.Println("Task C finished")
}

func main() {
    done := make(chan struct{})

    go taskA(done)
    go taskB(done)
    go taskC()

    time.Sleep(4 * time.Second) // 等待所有任务完成
}

在上述代码中:

  1. taskA函数完成后关闭done通道,以通知其他任务任务A已完成。
  2. taskB函数在接收到done通道的信号(通道关闭)后开始执行。
  3. taskC函数直接并发执行,不依赖任务A的完成信号。
  4. main函数中,启动三个任务,通过time.Sleep等待足够时间让所有任务执行完毕。实际应用中可能需要更优雅的同步机制来确保所有任务完成。