我在我的一个项目中使用libcurl。我知道curl不是用于发出多个并发请求,但是libcurl是否支持它?
我知道还有其他像ab这样的工具,但是libcurl提供了许多功能。 我再次知道我可以在脚本中使用curl来运行多个请求,但这不是我想要的。
我找不到一个令人满意的答案,因为期望this。虽然,这还不是决定性的。
我应该能够为多个连接使用多个句柄。
有人试过吗?有什么问题需要注意吗?
我应该可以这样做:
my_app --total_connections 1000 --concurrency 100 <Other libcurl options> url
答案 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
。
因此,您的问题的答案是:是的!
当然,使用流水线操作,保持活动和重用资源可以更有效地执行顺序执行。但这是另一个问题。