Асинхронный ограничитель задач current-limiter
Введение
Асинхронный ограничитель задач current-limiter создан для решения проблемы Error: EMFILE, too many open files. Она возникает, когда в системе уже открыто слишком много файлов и открыть новые невозможно. Это может произойти, если в Node быстро выполнить множество операций fs.readFile.
Установка
Для установки используйте команду:
yarn add https://github.com/masx200/async-task-current-limiter.git
Использование
Чтобы использовать ограничитель, выполните следующие шаги:
import AsyncLimiterClass from "@masx200/async-task-current-limiter";
const asynclimiter = AsyncLimiterClass(30);
const asynclimiter = new AsyncLimiterClass(30);
const listener = (data) => console.log(JSON.stringify(data));
asynclimiter.target.on("free", listener);
asynclimiter.target.on("full", listener);
async function asyncread() {
return await new Promise((s) => {
setTimeout(() => {
s("data:" + Math.random());
}, Math.random() * 2000);
});
}
const limitread = asynclimiter.asyncwrap(asyncread);
for (let i = 0; i < 1000; i++) {
setTimeout(() => {
limitread().then(console.log);
}, Math.random() * 5000);
}
Принцип работы
Ограничитель работает следующим образом: при вызове ограниченной функции её вызов помещается во внутреннюю очередь. Если количество активных вызовов меньше максимального, то вызов сразу выполняется, иначе он остаётся в очереди. Когда асинхронный вызов завершается, из очереди извлекается следующий вызов и выполняется. Таким образом, количество активных асинхронных вызовов не превышает установленного значения.
API
AsyncLimiterClass (max) — это функция или класс, который принимает параметр max, определяющий максимальное количество одновременно выполняющихся задач.
asynclimiter.target — это объект, публикующий и подписывающийся на события.
Событие 'free' происходит, когда ограничитель свободен. Можно прослушать событие, используя интерфейс statusdata.
Событие 'full' происходит, когда ограничитель заполнен. Можно прослушать событие, также используя интерфейс statusdata:
interface statusdata {
status: 空闲状态;
queue: {
max: number;
current: number;
};
limiter: {
max: number;
current: number;
};
}
asynclimiter.asyncwrap (fun) — это ограничитель асинхронных функций. Функция fun должна возвращать Promise. В результате получается ограниченная асинхронная функция.
Функция asynclimiter.status () возвращает состояние ограничителя — 'free' или 'full'.
Свойства asynclimiter.limiter.max и asynclimiter.queue.max определяют максимальное количество задач, которые могут выполняться одновременно.
Свойства asynclimiter.limiter.current и asynclimiter.queue.current показывают текущее количество выполняемых задач.
Пример использования
Пример использования ограничителя для одновременного открытия большого количества файлов:
import fs from "fs";
import AsyncLimiterClass from "@masx200/async-task-current-limiter";
const asynclimiter = AsyncLimiterClass(50);
declare const files: string[];
const limitreadfile = asynclimiter.asyncwrap(fs.promises.readFile);
files.forEach(async (file) => {
const buf = await limitreadfile(file);
console.log(buf);
});
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )