Что является более эффективным: curl_easy_perform () в многопоточной программе или curl_multi_perform () в однопоточной программе? - PullRequest
0 голосов
/ 25 сентября 2018

Я работаю над программой, в которой требуется загрузить большое количество файлов JSON с разных URL-адресов.

В настоящее время моя программа создает несколько потоков, и в каждом из них она вызывает LibCurl easy_perform (), но я сталкиваюсь с проблемами, когда программа завершается с ошибкой иногда с ошибкой "двойного освобождения".Кажется, это какой-то гейзенбаг, но я смог его отловить в GDB, который подтверждает, что ошибка возникла в LibCurl (backtraced).

Хотя я хотел бы услышать предложения по моей проблеме, мой фактический вопросэто: было бы лучше, если бы я изменил структуру моего кода, чтобы использовать мультиинтерфейс LibCurl в одном потоке вместо вызова одного интерфейса в нескольких потоках?Каковы преимущества использования одного над другим?

Примечание. Под словом «лучше» я подразумеваю, что он быстрее и дешевле для моего процессора?Является ли это более надежным, поскольку мультиинтерфейс был разработан для этого?

РЕДАКТИРОВАТЬ:

Три варианта, которые я понимаю, как я понимаю, это:

1) Повторное использованиеeasy_handle в одной теме.Соединения не нужно восстанавливать, чтобы сделать это быстрее.

2) Вызовите curl_easy_perform () в каждом отдельном потоке.Все они работают параллельно, опять же, делая это быстрее.

3) Вызовите curl_multi_perform () в одном потоке.Это неблокирующе, так что я думаю, что все файлы загружаются параллельно, что делает его быстрее?

Какой из этих вариантов наиболее эффективен по времени?

1 Ответ

0 голосов
/ 25 сентября 2018

curl_easy_perform - операция блокировки.Это означает, что если вы работаете в одном потоке, вы должны загружать файлы последовательно.В многопоточном приложении вы можете выполнять много операций параллельно - это обычно означает более быстрое время загрузки (если скорость не ограничена сетью или сервером назначения).

Но есть неблокирующий вариант, который может работать лучше для вас, если вы хотите пойти по однопоточному пути - curl_multi_perform

Из curl man

Вы можете сделатьлюбое количество вызовов curl_easy_perform при использовании того же easy_handle.Если вы намереваетесь передать более одного файла, вам даже рекомендуется это сделать.Затем libcurl попытается повторно использовать одно и то же соединение для следующих передач, тем самым делая операции более быстрыми, менее интенсивными с ЦП и используя меньше сетевых ресурсов.Просто обратите внимание, что вам придется использовать curl_easy_setopt между вызовами, чтобы установить параметры для следующего curl_easy_perform.

Короче говоря - это даст мало преимуществ, которые вы хотите, против curl_easy_perform.

...