进行并行libcurl HTTP请求

Make parallel libcurl HTTP requests

本文关键字:HTTP 请求 libcurl 并行      更新时间:2023-10-16

我有一个关于使用libcurl(C++)执行并行HTTP请求的安全性的问题。在阅读这个问题时,请记住,我对HTTP请求的总体了解有限。

基本上,假设我有两个(或更多)线程,每个线程每秒发出一次HTTP请求。(所有请求都指向同一台服务器)。我的程序(或其他程序?)如何跟踪哪个HTTP响应属于哪个线程?我的意思是,我可以确定,如果请求A是从线程1发送的,请求B是从线程2同时发送的,并且同时重试响应,那么正确的响应(响应A)将转到线程1,响应B将转到线程2吗?

请原谅我在这件事上的无知。

谢谢。

首先,libcurl是线程安全的:

libcurl的设计和实现完全是线程安全的

正如这份官方文件所指出的,你所需要做的就是:

Never在多个线程之间共享libcurl句柄。在任何给定的时间,您都应该在一个线程中只使用一个句柄。

此外,还有这个官方的FAQ条目,它提供了一些更精确的信息,例如,如果您计划使用SSL:

如果在多线程环境中使用OpenSSL支持的libcurl,则需要提供一个或两个锁定函数

正如您所看到的,有一个官方示例说明了易句柄的多线程使用:请参阅multithreads.c:

/* This is the callback executed when a new threads starts */
static void *pull_one_url(void *url)
{
  CURL *curl;
  curl = curl_easy_init();
  curl_easy_setopt(curl, CURLOPT_URL, url);
  curl_easy_perform(curl); /* ignores error */ 
  curl_easy_cleanup(curl);
  return NULL;
}
/* ... */
/* This is the main loop that creates `NUMT` threads for parallel fetching */
for(i=0; i< NUMT; i++) {
    error = pthread_create(&tid[i],
                           NULL, /* default attributes please */ 
                           pull_one_url,
                           (void *)urls[i]);
  /* ... */
}

请随意尝试一下这个例子。

最后请记住,libcurl还提供了一个所谓的多接口,使用单个线程提供多个传输。根据您的使用情况,您可能会发现它也很方便。

编辑

关于OpenSSL+多线程,有一些具体的官方例子可能会有所帮助:

  • opensslthreadlock.c
  • 线程化ssl.c