zoukankan      html  css  js  c++  java
  • go语言中如何模拟100个IP同时并发访问服务器,每个ip要重复访问1000次。每个Ip一分钟之内只能访问一次

    package  main
    
    import (
        "time"
        "sync"
        "fmt"
        "sync/atomic"
    )
    
    type  Ban struct {
        visitIPs  map[string]struct{}  //这个是什么意思
    }
    
    func NewBan() *Ban{
        return &Ban{visitIPs:make(map[string]struct{})}
    }
    //判断ip是否存在
    func (o *Ban) visit(ip string)bool{
        mapMutex.Lock()
        defer mapMutex.Unlock()
        if _, ok :=o.visitIPs[ip];ok{
            return true
        }
        o.visitIPs[ip]= struct{}{}
        go o.invalidAfter1Min(ip)
        return  false
    }
    func (o *Ban) invalidAfter1Min(ip string){
        time.Sleep(time.Minute *1)
        mapMutex.Lock()
        visitIPs :=o.visitIPs
        delete(visitIPs,ip)
        o.visitIPs=visitIPs
        mapMutex.Unlock()
    }
    var mapMutex *sync.Mutex   //声明锁
    
    func main(){
        mapMutex =new(sync.Mutex)  //创建一个锁
        var success int64    //声明
        ban :=NewBan()
        wg :=new(sync.WaitGroup)
        for i :=0;i<1000;i++{
            for j :=0;j<1000;j++{
                wg.Add(1)
                //fmt.Println('j',j)
                fmt.Println(j)
                ipEnd :=j
                go func() {
                    defer  wg.Done()
                    ip :=fmt.Sprintf("192.168.1.%d",ipEnd)
                    //fmt.Println(ipEnd)
                    if !ban.visit(ip){
                        atomic.AddInt64(&success,1)
                    }
                }()
            }
        }
        wg.Wait()
        fmt.Println("success:",success)
    
    
    }
  • 相关阅读:
    ubuntu安装pgAdmin 4
    python 读取文件
    byobu copy
    vim快捷键汇总
    python 停止线程
    python执行外部命令并获取输出
    gevent mysql
    python类型转换
    量化交易
    Java集合:HashMap底层实现和原理(源码解析)
  • 原文地址:https://www.cnblogs.com/1a2a/p/9144913.html
Copyright © 2011-2022 走看看