海运的博客

GO协程同步及限制协程数

发布时间:January 3, 2015 // 分类:GO // No Comments

使用同步锁同步:

package main

import "fmt"
import "time"
import "sync"

func main() {
        var wg sync.WaitGroup
        //生成带缓存的chan
        var limit = make(chan struct{}, 10)

        for i := 0; i < 100; i++ {
                //写入chan,直到缓存写满阻塞,即限制协程数
                limit <- struct{}{}
                //同步计数加1
                wg.Add(1)
                go func(i int) {
                        time.Sleep(1000 * time.Millisecond)
                         fmt.Println(i)
                        //协程内任务完成读取chan,主协程可继续写入chan
                        <-limit
                        //同步计数减1
                        defer wg.Done()
                }(i)
        }
        //同步阻塞直到计数为0,即所有协程完成
        wg.Wait()
}

使用channel同步:

package main

import "fmt"
import "time"

var sync chan int;
func foo(i int) {
        fmt.Println(i)
        time.Sleep(time.Second) 
        sync <- 0 
}

func main() {
        count := 100
        sync = make(chan int, count) 

        for i := 0; i < count; i++ {
                go foo(i)
        }

        //等待所有协程完成
        for i := 0; i < count; i++ {
                <-sync
        }
}

标签:none

发表评论

分类
最新文章
最近回复
  • spartan2: https://dashboard.hcaptcha.com/welcome_accessib...
  • 海运: 应该能,在购买页面先手工跳过cf机器验证,后续一定时间内不更换ip应该不会再次验证。
  • spartan: 大佬斯巴达开启了CF的机器识别验证,请问插件能自动跳过吗? 另外这个脚本有没有简单使用说明,新...
  • vincent: 膜拜大佬
  • 海运: proxy-header或proxy_protocol
  • liangjw: 如果是 内部调用 或者 中间存在 代理 而上一个代理又在内网 ,那怎么处理来自代理私有IP?
  • chainofhonor: 感谢,用dnsmasq设置自动判断BIOS和UEFI成功了
  • 海运: 不好意思,这个是很多年前的,现在也许已经不适用,我现在也不用多线了。
  • CQ: -m state --state NEW 替换成-m conntrack --ctstate NEW
  • CQ: 你好,我入站已经成功分流,但是不知道出站怎么设置,PREROUTING替换成POSTROUTI...