c – 进行并行libcurl HTTP请求
作者:互联网
我有一个关于使用libcurl(C)执行并行HTTP请求的安全性的问题.在阅读这个问题时,请记住我对HTTP请求的了解有限.
基本上,假设我有两个(或更多)线程,每个线程每秒发出一次HTTP请求. (所有请求都是在同一台服务器上).我的程序(或其他什么?)如何跟踪HTTP响应属于哪个步骤?我的意思是,我可以确定如果请求A是从线程1发送的,并且同时从线程2请求B,并且同时恢复响应,则正确的响应(响应A)将转到线程1并且响应B到线程2?
请原谅我对这件事的无知.
谢谢.
解决方法:
首先libcurl是thread safe:
libcurl is designed and implemented entirely thread safe
正如本官方文档所指出的,您需要做的就是:
Never share libcurl handles between multiple threads. You should only use one handle in one single thread at any given time.
此外,还有这个official FAQ entry提供了更多的精确度,例如,如果您计划使用SSL:
If you use a OpenSSL-powered libcurl in a multi-threaded environment, you need to provide one or two locking functions
正如您所看到的,有一个官方示例说明了简单句柄的多线程使用:请参阅multithread.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还提供了一个所谓的multi interface,它使用单个线程提供多个传输.根据您的使用情况,您可能会发现它很方便.
编辑
关于OpenSSL多线程,有一些特定的官方示例可能会有所帮助:
> opensslthreadlock.c
> threaded-ssl.c
标签:http-request,c,multithreading,libcurl 来源: https://codeday.me/bug/20191002/1842481.html