ZBLOG

golang 如何用信号量

在 Go 中,可以使用 sync 包中的 Mutex 或者 WaitGroup 实现信号量功能。下面是两种常见的使用方法:

  1. 使用 Mutex:
package main

import (
	"fmt"
	"sync"
)

func main() {
	var semaphore = make(chan struct{}, 3) // 设置信号量数量为3
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(id int) {
			semaphore <- struct{}{} // 获取一个信号量
			defer func() {
				<-semaphore // 释放一个信号量
				wg.Done()
			}()

			fmt.Printf("Goroutine %d: Start\n", id)
			// 执行需要控制并发的操作
			fmt.Printf("Goroutine %d: End\n", id)
		}(i)
	}

	wg.Wait()
	fmt.Println("All goroutines completed")
}
  1. 使用 WaitGroup:
package main

import (
    "fmt"
    "sync"
)

func main() {
    var semaphore = make(chan struct{}, 3) // 设置信号量数量为3
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(id int) {
            semaphore <- struct{}{} // 获取一个信号量
            defer func() {
                <-semaphore // 释放一个信号量
                wg.Done()
            }()

            fmt.Printf("Goroutine %d: Start\n", id)
            // 执行需要控制并发的操作
            fmt.Printf("Goroutine %d: End\n", id)
        }(i)
    }

    wg.Wait()
    fmt.Println("All goroutines completed")
}

这两种方式都可以实现信号量的功能,具体选择哪一种取决于你的需求和代码结构。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10622

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?