加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang WaitGroup 并发使用

发布时间:2020-12-16 19:14:57 所属栏目:大数据 来源:网络整理
导读:题目原地址 package main import ( "fmt" "sync" "time" "sync/atomic" ) const THREE_MINUTES = 3 * 60 * 1 type BanTable struct { VisTable map [ string ] int64 Lock *sync.Mutex} func NewBanTable() *BanTable { return BanTable{ VisTable: make ( m

题目原地址

package main

import (
    "fmt"
    "sync"
    "time"
    "sync/atomic"
)

const THREE_MINUTES = 3 * 60 * 1

type BanTable struct {
    VisTable map[string]int64
    Lock     *sync.Mutex
}

func NewBanTable() *BanTable {
    return &BanTable{
        VisTable: make(map[string]int64, 0),Lock:     new(sync.Mutex),}
}

func (self *BanTable) IsVisited(ip string) bool {
    self.Lock.Lock()
    defer self.Lock.Unlock()
    ts,ok := self.VisTable[ip]
    ret := false
    if ok && ts > 0 && time.Now().Unix()-ts < THREE_MINUTES {
        ret = true
    }
    if !ret {
        self.VisTable[ip] = time.Now().Unix()
    }
    return ret
}

func main() {
    var succ int64 = 0
    ban := NewBanTable()
    wg := new(sync.WaitGroup)
    for i := 0; i < 1000; i++ {
        for j := 0; j < 100; j++ {
            wg.Add(1)
            ip := fmt.Sprintf("192.168.1.%d",j)
            // 注意,若不注明参数类型,这里取外层的引用地址
            go func(ip string,wg *sync.WaitGroup,succ *int64) {
                defer wg.Done()
                if !ban.IsVisited(ip) {
                    atomic.AddInt64(succ, 1)
                }
            }(ip,wg,&succ)
        }
    }
    wg.Wait()
    fmt.Println("success:",succ)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读