Асинхронная обработка запросов с использованием многопоточности

#c #multithreading #asynchronous #curl #curl-multi

#c #многопоточность #асинхронный #curl #curl-multi

Вопрос:

Я работаю над модулем, который использует 10 очередей для обработки потоков, и каждый из них отправляет запросы curl с использованием интерфейса curl_easy (вместе с блокировкой), так что; одно соединение поддерживается до тех пор, пока ответ не будет получен. Я хочу улучшить обработку запросов с помощью интерфейса curl_multi, где запросы curl отправляются потоком и обрабатываются параллельно.

Я создал отдельный код для его реализации. Например, я создал 3 потока, которые обрабатываются один за другим, первый поток отправляет запрос в curl_multi, пока он не будет запущен, и существуют передачи, которые выделяют ресурсы с использованием интерфейса curl_easy для каждой передачи.

Я просмотрел множество примеров, но не могу понять, как это реализовать на C . Также, поскольку я недавно изучил концепции многопоточности и curl в C , мне нужна помощь с подходом.

Я ожидаю, что один поток должен иметь возможность отправлять запросы curl до тех пор, пока пользователь не прекратит отправку.

Обновление — Я добавил два потока, и каждый отправляет два запроса одновременно. curl_multi обрабатывается массивом дескрипторов для curl_easy. Я хочу, чтобы в нем не было массивов, потому что это ограничивает количество запросов.

Может ли это быть сделано асинхронным и принимать все передачи и завершаться только тогда, когда это делает клиент / пользователь. Существует достаточно примеров curl_multi, поэтому я не совсем понимаю его реализацию.

Ответ №1:

Читая curl_multi документацию, кажется, что вам не нужно создавать для этого разные потоки, поскольку это работает с помощью ваших нескольких простых дескрипторов, добавленных к объекту multi handle. Затем вы вызываете curl_multi_perform , чтобы начать все передачи неблокирующим способом.

Я ожидаю, что один поток должен иметь возможность отправлять запросы curl до тех пор, пока пользователь не прекратит отправку.

Я не понимаю, что вы имеете в виду под этим, вы имеете в виду, что вы просто хотите сохранить эти соединения активными, пока все не будет передано? Если это так, curl_multi уже предоставляет вам информацию о ходе ваших передач, которая может помочь вам определить, что делать.

Надеюсь, это поможет

Комментарии:

1. Спасибо вам за ответ! Да, я хочу поддерживать соединения до тех пор, пока все запросы не будут переданы и ответы на них не будут получены. Разные потоки предназначены только для распределения нагрузки, которое использовалось ранее.

2. @NabeelaRizvi Я бы посмотрел связанную документацию, поскольку в ней объясняются две разные реализации, которые вы могли бы выбрать, с функциями и объектами, связанными с каждой из них. Это может помочь выбрать лучшее для вас решение. В любом случае, curl_multi_perform может быть вызван несколько раз (и я предполагаю, что это приводит к повторной отправке запросов), чтобы завершить переводы.