62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package main
|
||
|
||
/*import (
|
||
"fmt"
|
||
"sync"
|
||
)
|
||
|
||
// 工作函数,演示通道作为信号量
|
||
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
|
||
defer wg.Done()
|
||
|
||
// 获取信号量
|
||
sem <- struct{}{}
|
||
defer func() { <-sem }() // 释放信号量
|
||
|
||
fmt.Printf("Worker %d 开始工作\n", id)
|
||
// 模拟工作
|
||
for i := 0; i < 3; i++ {
|
||
fmt.Printf("Worker %d 工作中...\n", id)
|
||
}
|
||
fmt.Printf("Worker %d 完成工作\n", id)
|
||
}
|
||
|
||
func main() {
|
||
// 带缓冲通道(容量2)
|
||
chBuffered := make(chan int, 2)
|
||
chBuffered <- 1 // 发送不阻塞(未达容量)
|
||
chBuffered <- 2
|
||
fmt.Println(<-chBuffered) // 接收:1
|
||
fmt.Println(<-chBuffered) // 接收:2
|
||
close(chBuffered)
|
||
|
||
// 关闭后发送会panic,接收返回零值
|
||
if v, ok := <-chBuffered; ok {
|
||
fmt.Println(v)
|
||
} else {
|
||
fmt.Println("通道已关闭") // 输出此句
|
||
}
|
||
|
||
// 无缓冲通道(发送/接收需同时就绪)
|
||
chUnbuffered := make(chan string)
|
||
go func() {
|
||
chUnbuffered <- "hello from goroutine" // 发送方:等待接收
|
||
}()
|
||
msg := <-chUnbuffered // 接收方:等待发送
|
||
fmt.Println(msg) // 输出:hello from goroutine
|
||
close(chUnbuffered)
|
||
|
||
// 通道实现信号量(限制并发数)
|
||
var wg sync.WaitGroup
|
||
sem := make(chan struct{}, 2) // 并发数限制为2
|
||
|
||
for i := 1; i <= 5; i++ {
|
||
wg.Add(1)
|
||
go worker(i, sem, &wg)
|
||
}
|
||
wg.Wait()
|
||
close(sem)
|
||
fmt.Println("所有工作完成")
|
||
}
|
||
*/
|