@eugene159

В каких случаях многократный вызов одного скрипта с разными параметрами ускорит выполнение задачи, а в каких — нет?

Есть скрипт на PHP CLI, который парсит Excel и добавляет товары в CMS.

Предположим, что на добавление одного товара уходит примерно секунд 30. Всего товаров - 3000.

Я могу одновременно запустить скрипт 3 раза:
1 запуск: 1-1000 товаров
2 запуск 1001-2000 товаров
3 запуск 2001-3000 товаров

А могу запустить скрипт всего 1 раз: 1-3000 товаров.

Я слышал, что web однопоточный. Да и в целом ведь ресурсы процессора делятся на все запуски скрипта.
В каких случаях многократный запуск скрипта ускорит выполнение задачи?
• Если на VPS больше одного ядра?
• Всегда?
• Еще при каких-либо обстоятельствах?

Как это узнать (кроме тестирования - запуска с засеканием времени - я хочу узнать теорию)?
Как рассчитать оптимальное количество запусков скрипта для определенной конфигурации сервера? Кол-во ядер * 2 (ведь в одном ядре 2 потока)?
  • Вопрос задан
  • 192 просмотра
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Если у вас задача потребляет CPU по максимуму, то да - распараллеливать её на большее количество процессов, чем имеется в наличии потоков - бессмысленно.
Но обычно задача по добавлению записи в БД потребляет не слишком много поцессора. А если речь про "парсинг", где процессор 99% времени ждет пакет из сети, распараллеливать можно хоть на десятки процессов.
Конкретное количество зависит от потребления процессора конкретной задачей.

Количество потоков не всегда равно количеству ядер, умноженному на два. Надо смотреть на конкретный процессор. Тем более на VPS, где процессор тоже виртуальный.

Если говорить про конкретный пример, то в идеале конечно надо написать нормальный код, который запишет в БД несчастные 3 тыщи товаров меньше чем за секунду. А заниматься параллелизмом уже когда счет пойдет на сотни тысяч. Тем более что цифра скорее всего взята с потолка. Я много повидал говнокода на своем веку, но такой, чтобы добавление одного товара занимало 30 секунд я даже вообразить себе не могу.

Единственная загадка - при чем тут "web", если речь идет про CLI. И, если уж говорить про веб, то с какой радости он "однопоточный".
Ответ написан
Комментировать
@maksam07
А если попробовать разобрать эту задачу с другой стороны:

SQL-запрос на добавление данных имеет вид: INSERT INTO table_name
VALUES (value1, value2, value3, ...)
что подразумевает добавление нескольких данных за один запрос. Возможно вы сможете сформировать все свои 3к товаров в один запрос, что, собственно, позволит вам сделать всего 1 запрос к БД, вместо 3-х тысяч и ожидать выполнения скрипта вообще не нужно будет.
Ответ написан
@aleksejjjjj
Общего ответа нет, зависит от задачи.

Условно, если ваш скрипт грузит БД, и она забирает 100% времени процессора/диска и прочее - запуск второй копии может даже замедлить процесс.

Если же сам скрипт выполняет сложные вычисления, то запуск инстансов по количеству потоков процессора может ускорить процесс.

И даже это лишь предположения, пальцем в небо. По факту, на реальном железе вы можете увидеть ровно противоположные результаты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы