Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: rudireg от Июнь 24, 2017, 22:44



Название: Много-поточная работа с сетью
Отправлено: rudireg от Июнь 24, 2017, 22:44
Привет.
Имеем социальную сеть и 100 аккаунтов от нее.
Стоит задача, авторизоваться на всех аккаунтах и делать от имени этих аккаунтов различные сетевые запросы в зависимости от условий и задач.
Программа что реализует данные задачи - должна быть очень шустрой.
Для реализации задачи смотрю в сторону много-поточности.
Для сетевых запросов будет использоваться QNetworkAсcessManager (qnam)
Так как он может работать асинхронно, для него будет создан отдельный вечно живущий поток,
который будет посылать и принимать запросы в сеть интернета.



Мы знаем, что в зависимости от флага QRunnable::setAutoDelete() объект в QThreadPool может быть уничтожен после выхода из функции run
либо может там оставаться (видимо засыпать и просыпаться используя releaseThread() и reserveThread())

И вот тут у меня возникло 3 впороса.
1 ВОПРОС.
Допустим поступила задача = АВТОРИЗОВАТЬСЯ на сайте
выполнение данной задачи состоит из трех операций
1) Зайти на сайта и получить куки
2) Отправит логин и пароль
3) Получить от сайта hash данные об успешной авторизиции

Как лучше поступить?  как организовать выполнение операций при взаимодействии с qnam ?
Создать объект с логикой авторизации, засунуть его в  QThreadPool на выполнение первой операции.
Оттуда объект посылает сигнал в qnam с запросом и засыпает там в QThreadPool или удаляется оттуда что бы не мешать другим потокам?
или может он там засыпает и не мешает другим потокам благодаря использованию releaseThread()
Но вот  qnam получил ответ на первую операцию, получается если объект по прежнему жив в  QThreadPool то он должен проснуться и получить данные,  а если мы приняли решение не хранить в  QThreadPool  объекты после их выполнения, то следует снова создать объект для выполнения уже второй операции и передать его в  QThreadPool  ???
Видимо я даже толком не могу сформировать первый вопрос,... если быть проще, то вопрос в том, как лучше организовать это хозяйство. Ибо данные мало просто отослать, их нужно еще обработать и выслать новый запрос на основе полученных данных.

2 ВОПРОС.
В документации к QThreadPool сказано, если я установлю QRunnable::setAutoDelete(true);
То собственником объекта станет QThreadPool, и объект будет удален тогда, когда последний поток в QThreadPool завершит свою работу.
Получается если я накидаю в QThreadPool около 1000 QRunnable объектов с флагом QRunnable::setAutoDelete(true); то эти объекты будут там находится до тех пор, пока есть хоть один работающий поток? получается на протяжении работы всей программы, если в QThreadPool всегда есть работающий поток, объекты будут собираться как мусор получается?
Или я не так что то понял?

3 ВОПРОС.
Если я буду отсылать в QThreadPool  объекты с флагом QRunnable::setAutoDelete(false);
То я смогу вызывать выполнение данного объекта повторно вызывая одну из функций:
Код
C++ (Qt)
myObject; // Inherit QRunable
QThreadPool::globalInstance()->start(myObject); // First
...
...
...
QThreadPool::globalInstance()->start(myObject); // Second
 
либо так еще можно
Код
C++ (Qt)
QRunnable::tryStart(this);
 

Объясните мне, что такое QRunnable::tryStart(this);
Получается объект прибывая в стеке потоков QThreadPool  
пытается запустить выполнение самого себя в новом потоке? при этом поток инициировавший данный вызов продолжит свое выполнение?



Название: Re: Много-поточная работа с сетью
Отправлено: Авварон от Июнь 29, 2017, 17:09
Тредпул тут не нужен.
Кажется, что нужно просто менять куки в нетворк манагере после очередного логина. Типа храним мапу <логин, печенька> и перед отправкой нужных запросов подсовываем печеньки.
Опционально можно сделать несколько тредов (без пула), по количеству ядер, но не очень понятно, зачем - врядли вы будете упираться в процессор.
Опционально можно сделать несколько манагеров в главном треде, чтобы слегка распаралелить запросы.


Название: Re: Много-поточная работа с сетью
Отправлено: rudireg от Июль 02, 2017, 18:02
Тредпул тут не нужен.
Кажется, что нужно просто менять куки в нетворк манагере после очередного логина. Типа храним мапу <логин, печенька> и перед отправкой нужных запросов подсовываем печеньки.
Опционально можно сделать несколько тредов (без пула), по количеству ядер, но не очень понятно, зачем - врядли вы будете упираться в процессор.
Опционально можно сделать несколько манагеров в главном треде, чтобы слегка распаралелить запросы.

1) Менять не только cookie но так же менять нужно и прокси, для каждого аккаунта свой прокси.
2) Я слышал что QNetworkAccessManager имеет лимит на кол-во одновременно выполняющихся запросов. Их вроде 6.
   Следует обойти этот лимит.


Название: Re: Много-поточная работа с сетью
Отправлено: vebmaster от Март 12, 2018, 17:43
По поводу setAutoDelete, у меня такое понятие.

    Bot *bot = new Bot(this, checkBot);
    bot->setAutoDelete(true); // true - поток уничтожается сразу же после завершения работы Bot
    threadPool_bot->start(bot);