Название: Много-поточная работа с сетью Отправлено: 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); То я смогу вызывать выполнение данного объекта повторно вызывая одну из функций: Код либо так еще можно Код
Объясните мне, что такое 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); |