Curl - Отправка сотен запросов, но только четыре одновременно - Программирование - PullRequest
0 голосов
/ 03 апреля 2019

Как вы решаете эту проблему?У меня есть сотни запросов для отправки в Curl, но я могу отправлять только четыре одновременно.

Таким образом, мне нужно сделать четыре запроса одновременно с использованием curl и обработать их ответы.Однако, как только один из указателей скручивания становится доступным, мне нужно отправить еще один запрос.

Это потому, что сервер может обрабатывать только четыре запроса одновременно, но у меня есть сотни запросов для отправкисервер.

Ниже приведен код, полученный с сайта curl

    int main(void)
    {
      const int HANDLECOUNT = 4;
      CURL *handles[HANDLECOUNT];
      CURLM *multi_handle;

      int still_running = 0; /* keep number of running handles */ 
      int i;

      CURLMsg *msg; /* for picking up messages with the transfer status */ 
      int msgs_left; /* how many messages are left */ 

      /* Allocate one CURL handle per transfer */ 
      for(i = 0; i<HANDLECOUNT; i++)
        handles[i] = curl_easy_init();

      /* set the options (I left out a few, you'll get the point anyway) */ 
      curl_easy_setopt(handles[0], CURLOPT_URL, "website");
      curl_easy_setopt(handles[0], CURLOPT_POSTFIELDS, XMLRequestToPost.c_str());
      curl_easy_setopt(handles[0], CURLOPT_POSTFIELDSIZE, (long)strlen(XMLRequestToPost.c_str())); 
      curl_easy_setopt(handles[1], CURLOPT_URL, "website");     
      curl_easy_setopt(handles[2], CURLOPT_URL, "website");    
      curl_easy_setopt(handles[3], CURLOPT_URL, "website");    

      /* set the request for other 3 handles too */
      /* init a multi stack */ 
      multi_handle = curl_multi_init();

      /* add the individual transfers */ 
      for(i = 0; i<HANDLECOUNT; i++)
        curl_multi_add_handle(multi_handle, handles[i]);

      /* we start some action by calling perform right away */ 
      curl_multi_perform(multi_handle, &still_running);

      while(still_running) {
      }


     }

1 Ответ

0 голосов
/ 03 апреля 2019

Создайте потокобезопасную очередь для размещения ваших запросов.

Запустите 4 потока, каждый со своим собственным объектом CURL.

Пусть каждый поток запускает цикл, который:

  • извлекает следующий запрос из очереди,
  • отправляет его
  • обрабатывает / отправляет ответ по мере необходимости,
  • и повторяет

Пока очередь не пуста.

...