Как долго должен спать поток, когда шаблон событий не применяется? - PullRequest
3 голосов
/ 24 февраля 2009

В основном цикле рабочего потока, который должен опросить, чтобы узнать, есть ли работа, я оставляю ее в спящем режиме, чтобы не быть занятой-ждать. Как определить хорошую длину для сна? Например если я просыпаюсь каждую миллисекунду, спать, наверное, вообще бесполезно. Если я просыпаюсь каждые десять минут, приложение может перестать отвечать на запросы (в зависимости от того, что делает поток).

Ранее я слышал, что кадриан говорит ниже, что пользователь-человек не заметит промежутки времени около 100 мс, но как насчет того, чтобы приблизиться к нему со стороны машины? Насколько маленький интервал может стать, прежде чем он станет бесполезным?

Полагаю, это сводится к более общей (т.е. независимой от платформы) версии этого вопроса .

РЕДАКТИРОВАТЬ: Конечно, вопрос всегда должен быть сначала перефразирован как «Как я могу изменить это на шаблон события вместо опроса», но давайте пока предположим, что я не могу или не хочу.

Ответы [ 5 ]

7 голосов
/ 24 февраля 2009

Иногда опрос - это ответ .

Однако частота опроса зависит от того, что делает поток, поэтому настройте его.

У нас есть темы, которые проверяют электронную почту. Они могут проверять внешние почтовые ящики, мы проверяем почтовые ящики каждые тридцать секунд или около того (но это настраивается). Каждая проверка - это вызов через Интернет, вызов каждой секунды или 10-й секунды может привести к сбоям в сети, 30 секунд - это нормально, и не имеет значения, что электронное письмо не обработано. некоторые сайты клиентов проверяют каждые 5 минут).

У нас есть другие потоки, которые опрашивают файлы в папке и / или для новых запросов, добавляемых в таблицу в базе данных. Эти опросы для работы каждые 1 до 5 секунд (в зависимости от того, что они делают).

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

Если вам нужно срочно сломать машину, нить Рипа Ван Винкля действительно закрутит ваш меллон.

Итак, соблюдайте интервалы между опросами так далеко, как вам нужно, но не спите дольше секунды.

Надеюсь, это поможет

2 голосов
/ 24 февраля 2009

У вас есть представление о том, сколько времени может занять операция? Может быть, диапазон? Я предполагаю, что ваш поток по сути делает это:

while(!workComplete) {
  Thread.Sleep(n);
}

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

Другой подход - экспоненциальный откат . Допустим, вы проверили через 200 мс, завершен ли ввод. Если это не так, в следующий раз спать в течение 400 мс. Если по истечении этого времени он не завершен, спать в течение 800 мс. и т. д. Вы должны убедиться, что через какое-то время вы сгенерируете исключение TimeoutException, чтобы вы могли избежать некоторого долгого сна.

1 голос
/ 24 февраля 2009

Если другой поток того же приложения передает ваш поток, вам следует рассмотреть возможность использования шаблона события вместо опроса. Например, в Java вы должны использовать wait / notify.

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

0 голосов
/ 24 февраля 2009

Вы должны запустить сигнал, чтобы предупредить поток. Если вы используете c, вы можете использовать что-то вроде условной переменной из p-threads. Если вы используете что-то более новое, например .NET, вы можете использовать EventWaitHandle. Я уверен, что Java и другие 4gl имеют классы, подобные EventWaitHandle.

0 голосов
/ 24 февраля 2009

Позвольте этому спать вечно, будите его, когда есть доступный ввод?

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