阅读 97

channel实现并发控制

前言

怎么用channel来控制并发呢?我们最直观的想法就是构造一个带缓存的channel,一个协程在执行前先往里面占一个坑,执行完后再释放这个坑位,这样一来始终只有固定数量的协程在同时执行,从而达到并发控制的效果。

 

实现

open-falcon里使用第三方包 github.com/toolkits/concurrent/semaphore 来实现这种效果,先上代码:

 

package main
import(
    "fmt"
    "time"
    nsema "github.com/toolkits/concurrent/semaphore"  //查看该源码,其实就是利用了channel来做并发控制
)

func main(){

    concurrentNum := 2 //设置并发数2
    sema := nsema.NewSemaphore(concurrentNum)

    for i:=0; i<8; i++ {
        sema.Acquire()  //先占一个坑,往channel里写一个数据
        go func(num int){
            defer sema.Release()   //释放坑位
            fmt.Printf("%d, get sema, ok\n", num)
            time.Sleep(1*time.Second)

        }(i)
    }
    // keep alive
    time.Sleep(5*time.Second)
}

 

 

结构体

type Semaphore struct {
    bufSize int
    channel chan int8    //带缓存的channel
}

 



Acquire()方法

 

func (this *Semaphore) Acquire() {
    this.channel <- int8(0)  //往cannel里写入一条数据
}

 

 

Release()方法
func (this *Semaphore) Release() {
    <-this.channel   //从channel里拿出一条数据
}

 

原文:https://www.cnblogs.com/zqwlai/p/15303254.html

文章分类
百科问答
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐