Автор оригинала: Maciej Cieślar.
Обычно машина, которая выполняет наш код, имеет ограниченные ресурсы. Делать все сразу, может не только обидеть, но также может повесить наш процесс и заставить его вообще перестать реагировать.
Когда мы хотим ползти 100 веб-сайтов, мы должны ползти, например, 5 одновременно, чтобы мы не занимаем всю доступную пропускную способность. Как только один сайт ползет, следующий готов к работе.
Вообще говоря, все «тяжелые» операции должны быть выложены вовремя. Они не должны быть выполнены все-одновременно, для лучшей производительности и сохранения ресурсов.
Реализация
Если вы знакомы с моим предыдущим постом о реализация обещаний Затем вы собираетесь заметить много сходств.
class Concurrently{ private tasksQueue: (() => Promise )[] = []; private tasksActiveCount: number = 0; private tasksLimit: number; public constructor(tasksLimit: number) { if (tasksLimit < 0) { throw new Error('Limit cant be lower than 0.'); } this.tasksLimit = tasksLimit; } private registerTask(handler) { this.tasksQueue = [...this.tasksQueue, handler]; this.executeTasks(); } private executeTasks() { while (this.tasksQueue.length && this.tasksActiveCount < this.tasksLimit) { const task = this.tasksQueue[0]; this.tasksQueue = this.tasksQueue.slice(1); this.tasksActiveCount += 1; task() .then((result) => { this.tasksActiveCount -= 1; this.executeTasks(); return result; }) .catch((err) => { this.tasksActiveCount -= 1; this.executeTasks(); throw err; }); } } public task(handler: () => Promise ): Promise { return new Promise((resolve, reject) => this.registerTask(() => handler() .then(resolve) .catch(reject), ), ); } } export default Concurrently;
Мы регистрируем данную задачу, добавив ее к нашему TasksQueue … а потом мы называем ExecuteTasks .
Теперь мы выполняем столько задач, сколько наш предел позволяет нам – один за другим. Каждый раз добавляя 1 на наш счетчик под названием tasksactivecount Отказ
Когда выполненная задача заканчивается, мы удаляем 1 из tasksactivecount И снова звонить ExecuteTasks .
Ниже мы можем увидеть пример того, как он работает.
Предел устанавливается на 3. Первые две задачи очень долго занимаются. Мы можем увидеть третий «слот», от времени открывающуюся от времени, позволяя следующей задаче в очереди быть выполненной.
Всегда есть три, не более, не меньше.
Вы можете увидеть код в Репозиторий Отказ
Большое спасибо за чтение! Можете ли вы подумать о любом другом пути достижения того же эффекта? Поделитесь их ниже.
Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь ставить их в раздел «Комментарий» ниже или отправить мне сообщение Отказ
Проверьте мой Социальные медиа Действительно
Присоединяйтесь к моей рассылке Действительно
Первоначально опубликовано www.mcieslar.com 28 августа 2018 года.
Оригинал: “https://www.freecodecamp.org/news/how-to-limit-concurrent-operations-in-javascript-b57d7b80d573/”