Почему бы не использовать 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() - это запах кода . Период.