Go 语言中如何进行并发编程 (concurrency)?

推荐答案

在 Go 语言中,并发编程主要通过 goroutinechannel 来实现。

使用 goroutine

goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理。你可以通过 go 关键字启动一个 goroutine

使用 channel

channel 是用于在 goroutine 之间进行通信的管道。你可以使用 make 函数创建一个 channel

通过 channel 发送和接收数据:

示例代码

以下是一个简单的并发编程示例:

-- -------------------- ---- -------
------- ----

------ -
    -----
    ------
-

---- --------------- ---- ---- -
    --- - -- -- - - -- --- -
        -- -- -
        --------------------------- - ----
    -
    ---------
-

---- ------ -
    -- -- --------- ----
    -- ----------------

    --- --- -- ----- -- -
        ----------------
    -
-

本题详细解读

goroutine

goroutine 是 Go 语言并发编程的核心。每个 goroutine 都是一个独立的执行单元,Go 运行时会自动将其调度到可用的 CPU 核心上执行。goroutine 的启动非常简单,只需在函数调用前加上 go 关键字即可。

channel

channel 是 Go 语言中用于 goroutine 之间通信的主要机制。channel 可以是带缓冲的或无缓冲的。无缓冲的 channel 会阻塞发送和接收操作,直到另一端准备好。带缓冲的 channel 则允许在缓冲区未满时发送数据,或在缓冲区不为空时接收数据。

并发与并行

Go 语言的并发模型是基于 CSP(Communicating Sequential Processes)理论,强调通过通信来共享内存,而不是通过共享内存来通信。这种模型使得并发编程更加安全和简单。

示例代码解析

在示例代码中,printNumbers 函数在一个独立的 goroutine 中运行,向 channel 发送数据。主 goroutine 则从 channel 中接收数据并打印。通过 close(ch) 关闭 channel,主 goroutine 使用 range 循环从 channel 中接收数据,直到 channel 被关闭。

注意事项

  • goroutine 的调度是非确定性的,因此不能依赖 goroutine 的执行顺序。
  • 使用 channel 时要注意避免死锁,确保发送和接收操作能够匹配。
  • 对于复杂的并发场景,可以使用 sync 包中的 WaitGroupMutex 等工具来协调 goroutine 的执行。
纠错
反馈