Что такое Throttling (ограничение частоты) в программировании?

Ответ

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

Основное применение:

  • Ограничение частоты запросов к API.
  • Обработка событий с высокой частотой (например, скролл, изменение размера окна).
  • Защита от злоупотреблений (rate limiting).

Пример реализации на JavaScript:

function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

// Использование: обработчик скролла сработает не чаще, чем раз в 100 мс
window.addEventListener('scroll', throttle(() => {
  console.log('Scroll position:', window.scrollY);
}, 100));

Отличие от Debouncing:

  • Throttling выполняет функцию с регулярными интервалами, пока происходит событие.
  • Debouncing выполняет функцию только после того, как событие прекратилось на заданное время.

Ответ 18+ 🔞

А, ну вот, смотри, опять эти ваши умные слова: «дросселирование», «паттерн». А по-простому, это когда ты, такой весь из себя, пытаешься на каждое чихание браузера отреагировать, а система тебе говорит: «Остынь, мудила, не чаще раза в секунду, а то я сейчас накроюсь медным тазом».

Короче, зачем это нужно, чтобы не еб... не перегрузить систему:

  • Ты там API какого-нибудь дергаешь, как последний извращенец, а он тебе в ответ: «Иди на хуй, больше трёх запросов в секунду не принимаю».
  • Пользователь скроллит страницу, а у тебя на каждый пиксель скролла какая-то тяжёлая хуйня запускается. Браузер просто взвывает: «Да ёпта, хватит!».
  • Ну и от дураков защита, которые думают, что если тыкать в кнопку «Отправить» со скоростью пулемёта, то быстрее отправится.

Вот, смотри, как это в коде выглядит, простейший вариант:

function throttle(func, limit) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

// Применяем: теперь при скролле сообщение в консоль будет вываливаться не чаще, чем раз в 100 мс, а не как сумасшедший граммофон.
window.addEventListener('scroll', throttle(() => {
  console.log('Scroll position:', window.scrollY);
}, 100));

И главное, не путай с другим зверем — Debouncing!

  • Throttling (наш герой) — это как строгий охранник: «Раз в N миллисекунд — и ни шагу больше!». Событие идёт потоком, а функция срабатывает чётко по таймеру.
  • Debouncing — это уже хитрая жопа. Он ждёт, пока ты, наконец, успокоишься и перестанешь дёргаться. Только после паузы он выполнит действие ОДИН РАЗ. Представь, что ты ищешь что-то в поиске: ты печатаешь, а запрос улетает не на каждую букву, а только когда ты, блядь, на полсекунды остановился.

Вот и вся разница, ебушки-воробушки. Throttling — для регулярности, Debouncing — для конечного результата после суеты. Выбирай, что тебе больше подходит, чтобы не получить пизды от производительности.