Я использую scrapy и scrapyd, чтобы сканировать контент. У меня работает 28 сканеров, но только 8 одновременно. Каждый сканер длится от 10 минут до нескольких часов. Поэтому я ищу способ правильно их упорядочить, чтобы минимизировать время активности сервера.
Я уже собираю информацию о том, сколько времени занимает каждое сканирование, так что это только проблема минимизации или как ее сформулировать.
Скрипт запускается с использованием php, поэтому решения должны запускаться на php.
Лучший способ, который я нашел, — настроить их как cronjobs для выполнения в определенное время. У меня есть около 30 cronjobs, настроенных на запуск в разное время, что означает, что вы можете установить определенное время для каждого записки.
Выполнение команды PHP с помощью cronjob в 17:00 каждый день:
* 17 * * * php /opt/test.php
Если вы выполняете команду scrapy python через cronjob, это:
* 17 * * * cd /opt/path1/ && scrapy crawl site1
Если вы используете virtualenv для вас Python, то его
* 17 * * * source /opt/venv/bin/activate && cd /opt/path1/ && scrapy crawl site1
Извините, что разочаровал вас, но в том, что вы описываете, нет ничего умного и никакой проблемы минимизации, потому что вы ничего не говорите о зависимостях между сканирующими заданиями. Самостоятельная работа займет ~ TOTAL_TIME
/THROUGHPUT
независимо от того, как вы их заказываете.
scrapyd начнет обрабатывать следующее задание, как только оно закончится. «8 за один раз» не является чем-то вроде корзины, поэтому здесь нет проблем комбинаторного / динамического программирования. Просто бросьте все 28 заданий на соскреб и дайте ему поработать. Когда вы проводите опрос и находите его бездействующим, вы можете выключить свой сервер.
У вас могут быть небольшие преимущества, если вы сначала запланируете самые длинные работы. Вы можете быстро сжимать несколько крошечных заданий в незанятых слотах, пока заканчиваются последние несколько длинных заданий. Но если вы не в каком-то плохом случае, эти преимущества не должны быть значительными.
Отметим также, что это число8
«- Я думаю, подкрепляется max_proc_per_cpu
и / или max_proc
— несколько произвольно. Если это не число, на которое вы попали в 100% ЦП или что-то в этом роде, возможно, большее число будет более подходящим.
Если вы хотите получить значительные выгоды, найдите 2-3 самых крупных рабочих места и найдите способ сократить их наполовину, например, если вы сканируете сайт с транспортными средствами, разделите одиночное сканирование на два, один для автомобилей и один для мотоциклов. Это обычно возможно и даст более значительные преимущества, чем изменение порядка. Например, если ваша более длительная работа составляет 8 часов, а следующая более длительная — 5, разделив самый длинный на два-четыре часа обхода, вы сделаете 5-часовую работу узким местом, потенциально сэкономив вашему серверу 3 часа.