Почему бы не использовать thread.sleep без причины и объяснить это программисту
При прохождении кода в нашем проекте я наткнулся на веб-метод, который имел этот код в конце:
thread.sleep(6000);
return true;
Теперь это было сделано, так что вызов jQuery ajax от клиента задерживается, и анимация ajax показывается немного дольше.
Это очень неправильно в моих глазах. Не должно быть такой связи между пользовательским интерфейсом и сервером. Если он хочет, чтобы анимация занимала больше времени, он может использовать функцию setTimeOut
на стороне клиента.
Вот моя проблема: как я могу объяснить программисту, почему это так неправильно? Не только потому, что клиент/сервер, но почему когда-либо звонил thread.sleep
на веб-сайт?
Ответы
Ответ 1
При задержке:
- Вы используете/блокируете поток
- Вы потребляете память
- У вас есть открытое соединение TCP/IP
все это дорогостоящие ресурсы на сервере
Потому что:
- Если возникают другие запросы, вероятность того, что новый поток должен быть создан, так будет использоваться процессор, память и т.д., и это задержит этот запрос. (Перейти к началу предложения).
- Больше потребляемой памяти, означает больше ошибок страницы, большую очередь на диске. Все запросы занимают больше времени.
- Соединения TCP/IP - это ограниченный ресурс.
Ответ 2
Это приведет к тому, что у вас будет много заблокированных потоков на сервере.
Допустим, у вас 100 запросов в секунду, у вас есть 600 нитей.
Эти потоки будут использовать 1 МБ ОЗУ в пространстве стека, тогда вы теряете 600 МБ ОЗУ сервера.
Ответ 3
ROFL - задержка анимации реализована на стороне сервера: D
Полагая задержку с оправданием, "клиенту требуется эта задержка", метод уведомляет клиента. И этот запах. В некотором смысле это также нарушает SRP - потому что теперь метод делает две вещи (делает что-то полезное и делает задержку), и если вы хотите спать, вы должны указать его так в имени, что-то вроде: DoSomethingUsefulAndDelayToo()
.
Но для меня "метод должен быть агностиком вызывающего" должен быть основным.
Извинение "нам нужна задержка" нарушает принцип разделения проблем - теперь ваш метод не только получает данные, но и загрязняется логикой представления (анимацией).
Кроме того, вы можете ввести задержку в очередь анимации (и должна) легко выполнить с помощью jQuery.
Принципы существуют по какой-то причине, по опыту, что нарушение принципов воздействия не всегда сразу проявляется в каждом случае, но в большинстве случаев оно возвращается и выслеживает вас.
Если он продолжает настаивать, по крайней мере, разбить метод на два - один метод будет просто "спать (6000), вернуться;" теперь это было бы смешно.
Ответ 4
Поскольку веб-метод может иметь несколько потребителей, не все из них хотят, чтобы их данные задерживались.
Update
Хорошо, также есть и конечное число рабочих потоков в пуле, которые будут обрабатывать запросы клиентов. Вы не хотите связывать их, ничего не делая. Это функция пользовательского интерфейса для задержки отображения данных, а не метода веб-службы/страницы, который предоставляет данные. Вы не посмели бы на вашем уровне доступа к данным, почему вы поместите его в WebMethod?
Ответ 5
как я могу объяснить программисту, почему это так неправильно?
Simple. Использование Sleep() - это запах кода . Период.