Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结合goroutines正确使用fasthttp.Client_Http_Go_Client_Goroutine_Fasthttp - Fatal编程技术网

结合goroutines正确使用fasthttp.Client

结合goroutines正确使用fasthttp.Client,http,go,client,goroutine,fasthttp,Http,Go,Client,Goroutine,Fasthttp,我是新手,正在寻找将net/http或fasthttp与goroutines一起使用的正确方法。不幸的是,没有太多的fasthttp客户端示例 我找到了以下代码:(Example1) 最大的问题是,这两种解决方案都正确吗? 或者Example2解决方案真的会创建一个新实例,并为每个goroutine使用大量内存吗 我用我的问题的片段制作了这些示例,在示例2中肯定缺少defer。这不是问题的一部分 一个小问题: (fastClient*fasthttp.Client,i int,wg*sync.W

我是新手,正在寻找将
net/http
fasthttp
与goroutines一起使用的正确方法。不幸的是,没有太多的
fasthttp
客户端示例

我找到了以下代码:(Example1

最大的问题是,这两种解决方案都正确吗? 或者Example2解决方案真的会创建一个新实例,并为每个goroutine使用大量内存吗

我用我的问题的片段制作了这些示例,在示例2中肯定缺少
defer
。这不是问题的一部分

一个小问题:
(fastClient*fasthttp.Client,i int,wg*sync.WaitGroup)
->fastClient和wg是指针,那么为什么要调用
grabbage(c,index,&wg)
而不是
grabbage(&c,index,&wg)

最大的答案是:两者都是正确的(因为它们工作得很好),只是不同而已

根据,一个
fasthttp.Client
对于并发使用是安全的,所以共享一个实例就可以了。它可能会遇到并发连接限制,但这可能不是问题

第二个示例确实有一些开销,无法重用连接或参数,但这可能是一个无关紧要的用例(如果我只执行两个操作,节省开销可能不值得优化)

关于问题的第二部分:

  • c
    已经是一个
    *fasthttp.Client
    ,因此不需要获取它的地址(
    &fasthttp.Client
    返回指向新
    fasthttp.Client
    的指针)
  • wg
    是一个普通的
    sync.WaitGroup
    ,因此必须使用该地址

感谢您的回答和更正我的问题。因此,对于15000个或更多的httprequests(请求参数总是相同的),创建一个实例并重用它应该更有效-同意吗?它肯定应该更有效(在内存和连接重用方面)。当然最好的方法是测试它。好的,当然,我会测试它。我不确定Go是否有一种机制可以将新实例捆绑到goroutines中(已经在编译时了)。类似于
fastClient:=&fasthttp.Client
的东西将创建一个全局实例,并将所有未来的实例请求传递给它(如池)。很难解释,我希望你理解我的想法。
package main

import (
    "bufio"
    "fmt"
    "github.com/valyala/fasthttp"
    "log"
    "net"
    "os"
    "sync"
    "time"
)

func grabPage(fastClient *fasthttp.Client, i int, wg *sync.WaitGroup) {
    defer wg.Done()
    _, body, err := fastClient.GetTimeout(nil, "https://en.wikipedia.org/wiki/Immanuel_Kant", time.Duration(time.Second*20))
    if err != nil {
        log.Fatal(err)
    }
    f, err := os.Create(fmt.Sprintf("./data/%d.txt", i))
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    w := bufio.NewWriter(f)
    w.Write(body)
}

func main() {
    var wg sync.WaitGroup
    total := 500

    c := &fasthttp.Client{
        Dial: func(addr string) (net.Conn, error) {
            return fasthttp.DialTimeout(addr, time.Second*10)
        },
        MaxConnsPerHost: total,
    }

    wg.Add(total)
    for index := 0; index < total; index++ {
        go grabPage(c, index, &wg)
    }
    wg.Wait()
}
func grabPage(i int, wg *sync.WaitGroup) {
    defer wg.Done()

    fastClient := &fasthttp.Client{
        Dial: func(addr string) (net.Conn, error) {
            return fasthttp.DialTimeout(addr, time.Second*10)
        },
        MaxConnsPerHost: 500,
    }

    _, body, err := fastClient.GetTimeout(nil, "https://en.wikipedia.org/wiki/Immanuel_Kant", time.Duration(time.Second*20))
    if err != nil {
        log.Fatal(err)
    }
    f, err := os.Create(fmt.Sprintf("./data/%d.txt", i))
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    w := bufio.NewWriter(f)
    w.Write(body)
}