进行并行libcurl HTTP请求
Make parallel libcurl HTTP requests
我有一个关于使用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
相关文章:
- 如何在boost beast http请求中设置http头
- 在多个核心中处理一个HTTP请求
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 使用 winsock 接收 http 请求
- 对于 http 请求,python 比 c++ 快吗?
- 在 C++/C 中使用 CURL 发出带有数据文件的 GET HTTP 请求
- 带有C++的 HTTP 请求
- 如何在QT中同步发送http请求
- 我可以使用 Boost.Asio 和 Boost.Beast 库发出 HTTPS 请求或 HTTP/2 请求吗?
- HTTP 请求中的标头名称无效
- 套接字或 HTTP 请求
- Winsock2.h 无法发送 http 请求
- 用libcurl生成http请求作为字符串
- http请求之前和之后的垃圾
- 从主机向在VirtualBox linux机器上运行的服务器发送http请求
- 如何在不阻塞 UI 线程的情况下对C++发出 http 请求
- C++ Boost 1.66 使用 Beast http 请求解析器解析字符串
- 在新线程C++中发送 http 请求
- 有什么方法可以通过按下按钮将HTTP请求从JS发送到C
- 套接字"Resource temporarily unavailable"的原始 HTTP 请求