golang 的 goroutine 和 channel

文章目录

    • [无缓冲的 channel](#无缓冲的 channel)
    • [有缓冲的 channel](#有缓冲的 channel)
    • [创建一个无缓冲的 channel 并在 select 语句中使用](#创建一个无缓冲的 channel 并在 select 语句中使用)
    • [goroutine 和 channel 生产者-消费者模型](#goroutine 和 channel 生产者-消费者模型)

无缓冲的 channel

无缓冲的 channel 在发送和接收操作时会阻塞,直到另一端准备好。

go 复制代码
ch := make(chan int)

有缓冲的 channel

带缓冲的 channel 在缓冲区未满时,发送操作不会阻塞;在缓冲区有数据时,接收操作不会阻塞。

go 复制代码
ch := make(chan int, 10) // 缓冲区大小为 10

创建一个无缓冲的 channel 并在 select 语句中使用

可以在 select 语句中使用 channel。

go 复制代码
func main() {
    ch := make(chan int)
    go func() {
        ch <- 42
    }()
    select {
    case val := <-ch:
        fmt.Println(val)
    }
}
  • 使用 make 函数创建 channel。
  • 可以创建无缓冲或带缓冲的 channel。
  • 可以通过方向操作符 <- 来限制 channel 的发送或接收能力。
  • channel 常用于 goroutine 之间的通信和同步。

goroutine 和 channel 生产者-消费者模型

不论 1:n 还是 n:1 或是 n:m,都可以使用 sync.WaitGroup 下面这种模型来操作。

go 复制代码
package main

import (
	"fmt"
	"sync"
	"time"
)

func producer(id int, jobs chan<- int, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i < 5; i++ {
		time.Sleep(time.Millisecond * 100)
		jobs <- i
		fmt.Printf("Producer %d produced %d\n", id, i)
	}
}

func consumer(id int, jobs <-chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for job := range jobs {
		time.Sleep(time.Millisecond * 500)
		fmt.Printf("Consumer %d consumed %d\n", id, job)
	}
}

func main() {
	jobs := make(chan int, 10)
	var wg sync.WaitGroup

	const numProducers = 3
	const numConsumers = 2
	wg.Add(numProducers)
	for i := 0; i < numProducers; i++ {
		go producer(i, jobs, &wg)
	}

	wg.Add(numConsumers)
	for i := 0; i < numConsumers; i++ {
		go consumer(i, jobs, &wg)
	}

	wg.Wait()
	close(jobs)
}
相关推荐
zh73144 小时前
typephp的编译核心phpx原理解析
android·java·开发语言
warpdrivelabs6 小时前
Codex 开源 harness 全面了解
开发语言·人工智能
丰锋ff10 小时前
基于 Qt 的智能门禁系统(二)
开发语言·qt
fpcc10 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
SomeB1oody11 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
Profile排查笔记11 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
用户9385156350712 小时前
用 AI 结对编程从 0 搭一个"单词后台管理系统":Next.js + Supabase + Drizzle + shadcn/ui 全记录
后端·postgresql·next.js
mqiqe12 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim12 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
脉动数据行情12 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股