Russian Qt Forum

Qt => Работа с сетью => Тема начата: BuRn от Август 27, 2013, 11:24



Название: QNetworkAccessManager метод get
Отправлено: BuRn от Август 27, 2013, 11:24
Добрый день. Правильно ли я понял, что если я сделаю что - то типа :
Код:
QNetworkAccessManager manager;
for(int i=0;i<100;i++)
{
  manager->get(QNetworkRequest(QUrl("http://google.com")));
}
То цикл открутится полностью, но в свою очередь одновременно 100 запросов к гуглу не будет ? Судя по доке, одновременно пройзет только 6 запросов , остальные 94 станут в очередь ? Каковы последствия если будет не 100, а 100000 к примеру


Название: Re: QNetworkAccessManager метод get
Отправлено: mutineer от Август 27, 2013, 11:27
В очередь станут 99994 запроса)))


Название: Re: QNetworkAccessManager метод get
Отправлено: BuRn от Август 27, 2013, 11:30
В очередь станут 99994 запроса)))
как это скажется на производительности ? или лучше все же эмитить какой - нибудь сигнал что освободилось место и делать еще один гет ?


Название: Re: QNetworkAccessManager метод get
Отправлено: mutineer от Август 27, 2013, 11:34
Зачем тебе вообще одновременно 100к гетов? Почему их последовательно не выполнить?


Название: Re: QNetworkAccessManager метод get
Отправлено: BuRn от Август 27, 2013, 11:40
Зачем тебе вообще одновременно 100к гетов? Почему их последовательно не выполнить?
Парсер. Я думаю если одновременно будет обрабатываться хотя бы по 6, то явно будет быстрее.


Название: Re: QNetworkAccessManager метод get
Отправлено: mutineer от Август 27, 2013, 11:44
Одна и та же страница будет обрабатываться 100 раз?
Быстрее будет не особо - загружаются страницы асинхронно, но передаваться тебе будут в один поток


Название: Re: QNetworkAccessManager метод get
Отправлено: BuRn от Август 27, 2013, 11:47
Одна и та же страница будет обрабатываться 100 раз?
Быстрее будет не особо - загружаются страницы асинхронно, но передаваться тебе будут в один поток
естественно страницы разные, это я пример просто привел, так будет происходить гет по вектору QString-ов в которых лежат урлы


Название: Re: QNetworkAccessManager метод get
Отправлено: mutineer от Август 27, 2013, 12:08
ИМХО лучше делать запрос по необходимости, а не забивать внутреннюю очередь "навырост"


Название: Re: QNetworkAccessManager метод get
Отправлено: alex312 от Август 27, 2013, 14:10
одновременно 100 запросов к гуглу
Не шутите так с гуглом - забанят !


Название: Re: QNetworkAccessManager метод get
Отправлено: schmidt от Август 28, 2013, 13:02
Зачем тебе вообще одновременно 100к гетов? Почему их последовательно не выполнить?
Парсер. Я думаю если одновременно будет обрабатываться хотя бы по 6, то явно будет быстрее.

+1 :) Чтобы что-то выполнялось параллельно, нужно выполнять это в  нескольких потоках. Я не силен в многопоточном программировании на Qt, но код ваш, скорее всего должен выглядеть так:

Код:
void proceedNextUrlFromSharedVector() {
    // Создать экземпляр QNetworkAccessManager, который будет обращаться к серверу

    // Создать экземпляр вашего класса, который будет обрабатывать конкретный ответ сервера для этого потока

    // Связать сигнал replyFinished() со слотом вашего объекта-обработчика

    // Взять следующий url из shared вектора (помня про мьютексы и прочие издержки многопоточной среды :) )

    // Отправить запрос через QNetworkAccessManager
}

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