gpt4 book ai didi

libcurl 可以用于发出多个并发请求吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:45:56 28 4
gpt4 key购买 nike

我正在为我的一个项目使用 libcurl。我知道 curl 不用于发出多个并发请求,但 libcurl 是否支持它?

我知道还有其他工具,例如 ab,但 libcurl 提供了很多功能。我再次知道我可以在脚本中使用 curl 来运行多个请求,但这不是我想要的。

我找不到这个期望的满意答案 this一。虽然,这不是决定性的。

我应该能够为多个连接使用多个句柄。

有人试过吗?有什么我需要注意的问题吗?
我应该能够做这样的事情:

 my_app --total_connections 1000 --concurrency 100 <Other libcurl options> url

最佳答案

为了测试您要查找的内容,我编写了一个小 C 程序。它在循环中使用 libcurl 执行 10 个 http-get 请求。该循环使用 openmp(如果可用)并行化。

要运行它,只需将它保存在一个名为 parallel_curl_test.cpp 的文件中,然后编译两次。第一次使用 g++ parallel_curl_test.cpp -fopenmp $(pkg-config --libs --cflags libcurl) -o parallel_curl 并行版本,第二次使用 g++ parallel_curl_test.cpp $(pkg -config --libs --cflags libcurl) -o sequential_curl 顺序版本没有 openmp。

代码如下:

#include <cmath>
#include <stdio.h>
#include <curl/curl.h>
#include <time.h>

void curl_request();
size_t write_data(void *, size_t, size_t, void *);

static struct timeval tm1;
static int num_requests = 10;

static inline void start()
{
gettimeofday(&tm1, NULL);
}

static inline void stop()
{
struct timeval tm2;
gettimeofday(&tm2, NULL);
unsigned long long t = 1000 * (tm2.tv_sec - tm1.tv_sec) + (tm2.tv_usec - tm1.tv_usec) / 1000;
printf("%d requests in %llu ms\n",num_requests , t);
}

int main()
{
start();
#pragma omp parallel for
for(int n=0; n<num_requests; ++n){
curl_request();
}
stop();

return 0;
}

void curl_request()
{
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_request() failed: %s\n",
curl_easy_strerror(res));

curl_easy_cleanup(curl);
}
}

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
return size * nmemb;
}

./parallel_curl 的输出将如下所示:

10 requests in 657 ms

./sequential_curl 的输出类似于:

10 requests in 13794 ms

如您所见,使用并发的 parallel_curl 比顺序运行的 sequential_curl 完成得快得多。

因此您的问题的答案是:是的!

当然,使用流水线、保持事件和资源重用可以更有效地完成顺序执行。但这是另一个问题。

关于libcurl 可以用于发出多个并发请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24459626/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com