Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задача на сообразительность: ограничитель производительности

27K
03 июля 2008 года
varilke
36 / / 04.05.2008
Нужно запускать неизвестную процедуру как можно чаще, но не чаще N раз в минуту. Время выполнения процедуры не известно и может меняться. Ограничение производительности должно выполняться для минуты, начинающейся с любой секунды.
304
03 июля 2008 года
Fenyx
707 / / 26.01.2005
нужно найти человека с мобльником и как можно больше - но не мног, то милиция загребет. Время определения нас милицыей неизвестно...
Вопрос не корректный как по мне...
27K
03 июля 2008 года
varilke
36 / / 04.05.2008
Поясню. N известно. Пусть будет 60. Процедура является черным ящиком и время ее работы меняется случайным образом.
4.7K
03 июля 2008 года
bobik02
140 / / 11.09.2007
Автор поясните реальную задачу ? (не ту что надо запустить не чаще чем раз в минуту продедуру и т.п.) возможно Вы выбрали изначально кривой подход к решении задачи.

п.с. Туманно как то вы задаете вопросы ! (Правильно поставленый вопрос - это половина успеха, и вероятность что вам кто то поможет выше)

Запускать скрипт cron-ном раз в минуту(или чаще, как нужно), все необходимые операции производить во внутреннем представлении скрипта! (т.е. запускать процедуру или нет, будет решать сам скрипт) как то так, но это гадание на кофейной гуще, как и поставленый вопрос ...
15
03 июля 2008 года
shaelf
2.7K / / 04.05.2005
 
Код:
function foo()
{
    sleep(mt_rand(1, 100000));
}
27K
03 июля 2008 года
varilke
36 / / 04.05.2008
Исходная задача: уложиться в лимиты сервера на обработку входящих запросов. А именно, нельзя требовать от сервера обработать более чем N запросов в минуту. Не уверен, что в этой постановке задача решаема. Поэтому сформулировал более простую в первом посте.

foo - это пример процедуры, которую надо вызывать как можно, чаще но не чаще N раз в минуту. Минута любая. Только 100000 - это много.

зы как запускать задачу кроном чаще, чем раз в минуту?
2
03 июля 2008 года
squirL
5.6K / / 13.08.2003
Цитата: varilke
Нужно запускать неизвестную процедуру как можно чаще, но не чаще N раз в минуту. Время выполнения процедуры не известно и может меняться. Ограничение производительности должно выполняться для минуты, начинающейся с любой секунды.



напишите демон, который фиксирует момент запуска, затем запускает "черный ящик". перед запуском - увеличивайте счетчик. проверяйте - если счетчик превысил N раз, то смотрите - прошло ли минута.

5
03 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: varilke
Нужно запускать неизвестную процедуру как можно чаще, но не чаще N раз в минуту. Время выполнения процедуры не известно и может меняться. Ограничение производительности должно выполняться для минуты, начинающейся с любой секунды.


60000 милисекунд (1 минута) делим на N и получаем период запуска задачи T милисекунд. Можно после каждого запуска задачи выжыдать T и запускать ее по новой. Если время выполнения задачи критично, то постоянно измеряем время выполнения задачи и вычисляем среднее арифметическое S. В итоге корректируем наш период T по формуле: T = (60000 - S * N) / N
Надеюсь ясно?

27K
03 июля 2008 года
varilke
36 / / 04.05.2008
Цитата: squirL
напишите демон, который фиксирует момент запуска, затем запускает "черный ящик". перед запуском - увеличивайте счетчик. проверяйте - если счетчик превысил N раз, то смотрите - прошло ли минута.


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

27K
03 июля 2008 года
varilke
36 / / 04.05.2008
Цитата: hardcase
60000 милисекунд (1 минута) делим на N и получаем период запуска задачи T милисекунд. Можно после каждого запуска задачи выжыдать T и запускать ее по новой. Если время выполнения задачи критично, то постоянно измеряем время выполнения задачи и вычисляем среднее арифметическое S. В итоге корректируем наш период T по формуле: T = (60000 - S * N) / N
Надеюсь ясно?


Не очень. За какой период среднее?

5
03 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: varilke
Не очень. За какой период среднее?


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

27K
04 июля 2008 года
varilke
36 / / 04.05.2008
А если без среднего?
Вычисляем T = 60000/N
Запускаем процедуру и замеряем время ее выполнения (t)
Если T-t>0 то добавляем задержку на T-t, мс

Есть еще одна идея, как не перегрузить сервер запросами. С того момента, как будут приходить ответы, отправлять один запрос на один ответ.

Как все это написать на PHP?
Как это будет работать, если сервер тормозит?
Каким еще способом сервер может измерять, что на него приходит много запросов с одной и той же кукой?
2
04 июля 2008 года
squirL
5.6K / / 13.08.2003
Цитата: varilke
кажется, в этом варианте не учитывается, что минута может начинаться с любой секунды. с какой неизвестно.


почему? у вас есть время запуска с которого начат отсчет N. при достижении N - вы вычисляете текущее время минус время запуска. вот вам проверка на минуту. при начале нового отсчета N - время устанавливается заново

27K
04 июля 2008 года
varilke
36 / / 04.05.2008
Цитата: squirL
почему? у вас есть время запуска с которого начат отсчет N.


Потому что у нас нет времени запуска, с которого начат отсчет N. Можно начать отсчет с любой секунды.

2
07 июля 2008 года
squirL
5.6K / / 13.08.2003
Цитата: varilke
Потому что у нас нет времени запуска, с которого начат отсчет N. Можно начать отсчет с любой секунды.



ну так и начинайте. и сохраняйте это время

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог