1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/masx200-async-task-current-limiter

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Асинхронный ограничитель задач current-limiter

Введение

Асинхронный ограничитель задач current-limiter создан для решения проблемы Error: EMFILE, too many open files. Она возникает, когда в системе уже открыто слишком много файлов и открыть новые невозможно. Это может произойти, если в Node быстро выполнить множество операций fs.readFile.

Установка

Для установки используйте команду:

yarn add https://github.com/masx200/async-task-current-limiter.git

Использование

Чтобы использовать ограничитель, выполните следующие шаги:

  1. Импортируйте класс AsyncLimiterClass из модуля @masx200/async-task-current-limiter:
import AsyncLimiterClass from "@masx200/async-task-current-limiter";
  1. Создайте объект асинхронного ограничителя, задав максимальное количество одновременно выполняемых асинхронных задач:
  • как функция:
const asynclimiter = AsyncLimiterClass(30);
  • или как класс:
const asynclimiter = new AsyncLimiterClass(30);
  1. Прослушайте события free и full асинхронного ограничителя:
const listener = (data) => console.log(JSON.stringify(data));
asynclimiter.target.on("free", listener);
asynclimiter.target.on("full", listener);
  1. Оберните функцию асинхронной операции с помощью ограничителя:
async function asyncread() {
    return await new Promise((s) => {
        setTimeout(() => {
            s("data:" + Math.random());
        }, Math.random() * 2000);
    });
}
const limitread = asynclimiter.asyncwrap(asyncread);
  1. Выполните большое количество асинхронных операций с ограничением:
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 )

Вы можете оставить комментарий после Вход в систему

Введение

Асинхронный ограничитель потока задач. Развернуть Свернуть
MulanPSL-1.0
Отмена

Обновления (2)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/masx200-async-task-current-limiter.git
git@api.gitlife.ru:oschina-mirror/masx200-async-task-current-limiter.git
oschina-mirror
masx200-async-task-current-limiter
masx200-async-task-current-limiter
master