почему бы не использовать thread.sleep без причины и объяснить это программисту - PullRequest
11 голосов
/ 10 ноября 2010

Проходя через код в нашем проекте, я наткнулся на веб-метод, у которого в конце был следующий код:

thread.sleep(6000);
return true;

Теперь это было сделано для того, чтобы ajax-вызов jQuery от клиента задерживался, и анимация ajax будет отображаться немного дольше.

Это очень неправильно в моих глазах. Не должно быть такого рода соединения между пользовательским интерфейсом и серверной стороной. Если он хочет, чтобы анимация длилась дольше, он может использовать функцию setTimeOut на стороне клиента.

Вот моя проблема: как я могу объяснить программисту, почему это так неправильно? Не только потому, что клиент / сервер, а зачем вообще звонить на сайт thread.sleep?

Ответы [ 5 ]

16 голосов
/ 10 ноября 2010

при задержке:

  • Вы используете / блокируете тему
  • Вы используете память
  • У вас есть открытое соединение TCP / IP

это все дорогие ресурсы на сервере

Потому что:

  • Если поступают другие запросы, вероятность того, что будет создан новый поток, будет больше, поэтому при этом будут использоваться процессор, память и т. Д., Что приведет к задержке этого запроса. (Перейти к началу предложения).
  • Большее потребление памяти означает больше сбоев страниц, большую очередь на диске. Все запросы занимают больше времени.
  • Соединения TCP / IP являются ограниченным ресурсом.
7 голосов
/ 10 ноября 2010

В результате будет получен доступ ко многим заблокированным потокам на сервере.
Допустим, у вас 100 запросов в секунду, а у вас 600 спящих потоков.
Эти потоки будут использовать 1 МБ ОЗУ в пространстве стека, вызатем трата 600 МБ оперативной памяти сервера.

4 голосов
/ 10 ноября 2010

ROFL - задержка анимации, реализованная на стороне сервера: D

Установка задержки с оправданием «клиенту нужна эта задержка» делает метод осведомленным о клиенте. И это запах. В некотором смысле это также нарушает SRP - потому что теперь метод делает две вещи (делает что-то полезное И делает задержку), и если вы хотите сохранить сон, вы должны указать это так в имени, что-то вроде: DoSomethingUsefulAndDelayToo().

Но для меня «метод должен быть независимым от вызывающего» должен быть главным.

Оправдание "нам нужна задержка" нарушает принцип разделения интересов - поскольку теперь ваш метод не только получает ваши данные, но и искажается логикой представления (анимацией).

Кроме того, вы можете ввести задержку в очередь анимации можно (и нужно) легко сделать с помощью jQuery.

Принципы существуют по определенной причине. Из опыта видно, что нарушение принципов не всегда проявляется сразу в каждом случае, но в большинстве случаев оно возвращается и выслеживает вас.

Если он продолжит настаивать, по крайней мере, разбейте метод на два - один метод просто сделает "sleep (6000); return;" теперь это было бы смешно.

2 голосов
/ 10 ноября 2010

как я могу объяснить программисту, почему это так неправильно?

Simple. Использование Sleep () - это кодовый запах . Период.

2 голосов
/ 10 ноября 2010

Поскольку у веб-метода может быть несколько потребителей, не все из них хотят, чтобы их данные были отложены.

Обновление

Хорошо, хорошо, есть и конечное числорабочих потоков в пуле, которые будут обрабатывать клиентские запросы.Вы не хотите связывать их, ничего не делая на самом деле.Это функция пользовательского интерфейса для задержки отображения данных, а не метод веб-службы / страницы, который предоставляет данные.Вы бы не засыпали в своем слое доступа к данным, зачем помещать его в WebMethod?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...