【问题标题】:V-lang: How to send +2500 HTTP requests per second?V-lang:如何每秒发送 +2500 个 HTTP 请求?
【发布时间】:2021-01-17 15:37:20
【问题描述】:

我打算用 V 编写我的爬虫,我需要每秒发送大约 2500 个请求,但不知道我做错了什么,它应该同时发送,但现在速度非常慢。感觉我做错了什么,但我想不通。

import net.http
import sync
import time

fn send_request(mut wg sync.WaitGroup) ?string {
    start := time.ticks()
    data := http.get('https://google.com')?
    finish := time.ticks()
    println('Finish getting time ${finish - start} ms')
    wg.done()
    return data.text
}



fn main() {
    mut wg := sync.new_waitgroup()
    for i := 0; i < 50; i++ {
        wg.add(1)
        go send_request(mut wg)
    }
    wg.wait()
}

输出:

...
Finish getting time 2157 ms
Finish getting time 2173 ms
Finish getting time 2174 ms
Finish getting time 2200 ms
Finish getting time 2225 ms
Finish getting time 2380 ms
Finish getting time 2678 ms
Finish getting time 2770 ms

V 版本:0.1.29

系统:Ubuntu 20.04

【问题讨论】:

  • 我认为操作系统对一次可以建立多少个连接也有限制。我在 Linux 和 Mac 上遇到过这个问题。话虽如此,您可能希望实现一个队列来一次执行 100 个操作。
  • 可能需要代理轮换器。你的ip可能被限制了。 net.http in v 支持代理吗?

标签: concurrency vlang


【解决方案1】:

发送这么多 get 请求的最佳方式也是使用所谓的 Head 请求,它依赖于状态码而不是响应,因为它不返回任何内容。这就是使 http 请求更快的原因。

【讨论】:

    【解决方案2】:

    你没有做错任何事。我以多种方式在多种语言中获得了类似的结果。许多网站都有速率限制软件,可以防止像这样的重复读取,这就是你遇到的问题。

    您现在可以尝试使用频道,但您仍然会遇到速率限制器。

    【讨论】:

    • 我也怀疑这可能是网络瓶颈,但我使用 Python 之类的解释性语言获得了更好的结果,而且它比我的 GO 的性能要慢得多,因为应该没有太大区别它主要依赖于网络操作和一些 Socket API 调用,但通道听起来值得一试,谢谢
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多