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

时间:2014-06-27 19:38:17

标签: c curl libcurl

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

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

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

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

有人试过吗?有什么问题需要注意吗?
我应该可以这样做:

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

1 个答案:

答案 0 :(得分:1)

为了测试你在寻找什么,我写了一个小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

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

当然,使用流水线操作,保持活动和重用资源可以更有效地执行顺序执行。但这是另一个问题。