- Регистрация
- 10.12.2018
- Сообщения
- 1 021
- Реакции
- 1 431
- Баллы
- 113
Настройка многозадачности в рамках одного потока.
В этот раз поговорим о многопоточности/многозадачности внутри одного потока зеннопостера.
Тема должна понравиться обладателям лайт/стандарт лицензий, зеннобоксов и тем, кто хочет запускать шаблон многопоточно в проджект-мейкере. Ну, может еще кому-то, кто начинает грызть C# или просто прохожему.
Я иногда использую похожий подход в написании шаблонов, где это действительно имеет смысл потому, что это очень удобно в последующем использовании, если все тщательно продумать, и действительно способно в некоторых случаях сэкономить массу ресурсов.
Ничего сложного и секретного здесь нет. Простейший пример и простейшее исполнение на самом деле.
Я не стал делать рерайт документации и статей на блогах по используемым методам, а решил собрать то, что можно пощупать, как говорится.
Для того, чтобы это все работало, нужно повторить настройки потоков зенки для шаблона, а именно, количество выполнений и максимальное количество потоков.
Первое реализовано при помощи класса Thread Thread а второе при помощи класса Semaphore.
Шаблон выполнен в простом варианте, чтобы было доступнее для понимания, как это вообще организовано
Объявляем класс Program, в его конструкторе назначаем все необходимые переменные для работы, для этого передаем ему текущий project и instance.
Нам понадобится профиль, случайная выборка сайтов из общего списка ну и остальные переменные, которые тянутся из входных настроек, такие как число потоков, число сайтов, списки.
Последней строкой вызывается метод Run(). Это основной обычный поток шаблона. Его цель запустить дочерние потоки и дождаться их завершения.
В данном примере под каждый сайт из случайной выборки создается и стартует отдельный поток Thread, котрый будет исполнять метод Worker().
Каждому потоку назначено уникальное имя хоста, Url которого ему предстоит посетить. Все потоки складываются в список и далее основной поток просто в цикле проверяет состояние дочерних. Также, он проверяет принудительную остановку по кнопке "Прервать" и в этом случае принудительно завершает запущенные потоки. В конце сохраняется профиль.

В полученной конструкции в методе Worker() содержится вся логика для работы каждого отдельного потока в своей вкладке.

Одновременная работа потоков регулируется при помощи Semaphore, который пропускает к одновременному выполнению лишь ограниченное число потоков.
А дальше тут все предельно просто. Да, можно вести всю ту же работу, к которой вы все привыкли одновременно в нескольких вкладках.
По имени потока открывается новая вкладка с этим же именем, по хосту отлавливается Url из случайной выборки, ожидание загрузки страницы и рандомное время пребывания выполненного в виде самой примитивной паузы. Ну и оповещение в лог.
Прикрепляю список сайтов, который у меня завалялся от какого-то древнего заказа по парсингу dmoz.
Вот так вот просто это на самом деле устроено. 50 строк кода и немножко логики.
А теперь давайте попробуем позапускать и посмотреть, что же из этого получилось
Нагуливание профилей (кук) с настройками многозадачности.
Ускоренный простой нагуливатель кук. Идея заключается в том, чтобы запустить посещение списка сайтов одновременно в разных вкладках одного инстанса, что непременно должно снизить нагрузку на железо для столь простого, но весьма прожорливого процесса, как нагул кук.
Шаблон выбирает из папки Profiles профиль, у которого замечена самая ранняя последняя активность, это организовано при помощи сортировки по FileInfo.LastAccessTime.
Поэтому перед запуском папка Profiles уже должна быть создана и содержать в себе профили в формате .zpprofile
В настройках все достаточно просто и понятно.
Я не делал муторные проверки на некорректность заполнения настроек. Это усложнило бы только читабельность кода. Поэтому будьте внимательны: Настройки есть, значит их надо заполнить.
В списке прокси должны быть прокси, в списке сайтов список url сайтов без дублей по хостам. Одновременных 100 потоков лучше не ставить.

Жмем старт, +1 и смотрим, как идет работа.

Минимальная версия для запуска шаблона 7.2.0.0
В этот раз поговорим о многопоточности/многозадачности внутри одного потока зеннопостера.
Тема должна понравиться обладателям лайт/стандарт лицензий, зеннобоксов и тем, кто хочет запускать шаблон многопоточно в проджект-мейкере. Ну, может еще кому-то, кто начинает грызть C# или просто прохожему.
Я иногда использую похожий подход в написании шаблонов, где это действительно имеет смысл потому, что это очень удобно в последующем использовании, если все тщательно продумать, и действительно способно в некоторых случаях сэкономить массу ресурсов.
Ничего сложного и секретного здесь нет. Простейший пример и простейшее исполнение на самом деле.
Я не стал делать рерайт документации и статей на блогах по используемым методам, а решил собрать то, что можно пощупать, как говорится.
Для того, чтобы это все работало, нужно повторить настройки потоков зенки для шаблона, а именно, количество выполнений и максимальное количество потоков.
Первое реализовано при помощи класса Thread Thread а второе при помощи класса Semaphore.
Шаблон выполнен в простом варианте, чтобы было доступнее для понимания, как это вообще организовано
Объявляем класс Program, в его конструкторе назначаем все необходимые переменные для работы, для этого передаем ему текущий project и instance.
Нам понадобится профиль, случайная выборка сайтов из общего списка ну и остальные переменные, которые тянутся из входных настроек, такие как число потоков, число сайтов, списки.
Последней строкой вызывается метод Run(). Это основной обычный поток шаблона. Его цель запустить дочерние потоки и дождаться их завершения.
В данном примере под каждый сайт из случайной выборки создается и стартует отдельный поток Thread, котрый будет исполнять метод Worker().
Каждому потоку назначено уникальное имя хоста, Url которого ему предстоит посетить. Все потоки складываются в список и далее основной поток просто в цикле проверяет состояние дочерних. Также, он проверяет принудительную остановку по кнопке "Прервать" и в этом случае принудительно завершает запущенные потоки. В конце сохраняется профиль.

В полученной конструкции в методе Worker() содержится вся логика для работы каждого отдельного потока в своей вкладке.

Одновременная работа потоков регулируется при помощи Semaphore, который пропускает к одновременному выполнению лишь ограниченное число потоков.
А дальше тут все предельно просто. Да, можно вести всю ту же работу, к которой вы все привыкли одновременно в нескольких вкладках.
По имени потока открывается новая вкладка с этим же именем, по хосту отлавливается Url из случайной выборки, ожидание загрузки страницы и рандомное время пребывания выполненного в виде самой примитивной паузы. Ну и оповещение в лог.
Прикрепляю список сайтов, который у меня завалялся от какого-то древнего заказа по парсингу dmoz.
Вот так вот просто это на самом деле устроено. 50 строк кода и немножко логики.
А теперь давайте попробуем позапускать и посмотреть, что же из этого получилось
Нагуливание профилей (кук) с настройками многозадачности.
Ускоренный простой нагуливатель кук. Идея заключается в том, чтобы запустить посещение списка сайтов одновременно в разных вкладках одного инстанса, что непременно должно снизить нагрузку на железо для столь простого, но весьма прожорливого процесса, как нагул кук.
Шаблон выбирает из папки Profiles профиль, у которого замечена самая ранняя последняя активность, это организовано при помощи сортировки по FileInfo.LastAccessTime.
Поэтому перед запуском папка Profiles уже должна быть создана и содержать в себе профили в формате .zpprofile
В настройках все достаточно просто и понятно.
Я не делал муторные проверки на некорректность заполнения настроек. Это усложнило бы только читабельность кода. Поэтому будьте внимательны: Настройки есть, значит их надо заполнить.
В списке прокси должны быть прокси, в списке сайтов список url сайтов без дублей по хостам. Одновременных 100 потоков лучше не ставить.

Жмем старт, +1 и смотрим, как идет работа.

Минимальная версия для запуска шаблона 7.2.0.0
- Номер конкурса шаблонов
- Десятый конкурс шаблонов
Вложения
Последнее редактирование модератором:








чем не кейс!

