其他分享
首页 > 其他分享> > c – 进行并行libcurl HTTP请求

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