一次go语言实现并发上传附件的功能的猜想

2020-03-15  本文已影响0人  江江简书

前言:最近在做一个php附件转移的功能,起初是通过php实现了,但是咧太浪费时间了如果我的附件有10万张,假设1张图片上传需要1秒,那么意味着要花费10万秒,那这个时间我是不能容忍的,因此想通过go语言协程来实现并发请求php开发的接口来实现并行转移附件,这样就可以大大减少附件上传的时间

首先你需要下载go语言模拟curl请求的包,

https://github.com/idoubi/goz

然后编写接口访问接口的go语言

package main
import (
    "fmt"
    "sync"
    "time"
    "github.com/idoubi/goz"
    "log"
)

func main() {
    wg := &sync.WaitGroup{}
    limiter := make(chan bool, 20)
    codedata := [...]string{"00001","00002","00003","00004"}
    for _,val := range codedata{
        wg.Add(1)
        limiter <- true
        go getApi(val,limiter,wg)
    }
    wg.Wait()
}
func getApi(idcode string, limiter chan bool, wg *sync.WaitGroup)  {
    defer wg.Done()
    cli := goz.NewClient()
    resp, err := cli.Get("xxxt?id="+idcode,goz.Options{
        Headers: map[string]interface{}{
            "User-Agent": "testing/1.0",
            "Accept":     "application/json",
            "X-Foo":      []string{"Bar", "Baz"},
        },
    })
    //resp, err := cli.Get("https://www.baidu.com/")
    if err != nil {
        log.Fatalln(err)
    }
    body,err1 := resp.GetBody()
    if err1 != nil{
        log.Fatalln(err)
    }
contents := body.GetContents()
fmt.Printf("value:%s,idcode:%v,time:%v\n",contents,idcode,time.Now().Unix())
    time.Sleep(1 * time.Second)
    <-limiter
}

结束:这期间用tp5.1访问时候会频繁的报错,后面换原生的方式开发接口,并且通过控制并发的数量从而实现对服务器减压,防止并发过大,

上一篇 下一篇

猜你喜欢

热点阅读