Как долго должен находиться поток в спящем режиме, если шаблон событий не применяется?

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

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

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

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

Ответов (5)

Решение

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

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

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

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

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

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

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

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

Дать ему спать вечно, разбудить его, когда есть входные данные?

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

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

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

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

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

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

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