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)
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |