Сегодня написал первую тестовую версию реализации "лёгких потоков" на основе прерываний (yield) и планировщика с системой приоритетов.
Видео
Одновременно создаётся 50 forEach, в каждом по 1кк итераций и рандомно задаются приоритеты, т.е. общее количество итераций 50кк. Интерфейс не лочится и тормозов нет в принципе, результатом очень доволен. Думаю завтра / послезавтра зарелизю 5.2 версию с поддержкой.
Плюсы лёгкий потоков:
1) Нет затрат на создание;
2) Т.к. всё крутится в рамках главного потока, то прямой доступ к DOM и переменным замыкания (но тут нужно быть аккуратным, ибо моно выстрелить себе в ногу
);
3) Нет ограничений на количество создаваемых потоков (вернее есть, но равно количеству доступной памяти)
Минусы:
1) Требуется поддержка генераторов, т.е. пока работает только в ФФ, Хроме и компании, Ноде. В ИЕ ожидается с 12-й версии.
2) Теоретически возможно залочить поток, если сама итерация в цикле будет очень тяжёлой.
Алгоритм:
В рамках одной итерации событийного цикла JS
все асинхронные процессы Collection могут забрать не более 60мс времени суммарно. У каждой задачи есть приоритет (по умолчанию normal)
var maxPriority = 40;
var priority = {
'low' : maxPriority / 8,
'normal' : maxPriority / 4,
'hight' : maxPriority / 2,
'critical': maxPriority
};
Чем выше приоритет, тем выше вероятность, что данная задача попадёт в исполнение конкретного событийного цикла (но не 100%). Задачи с одинаковым приоритетом выбираются случайно с линейным распределением.
Определение выполняемых задач осуществляется на каждой итерации событийного цикла.
PS: цифорки на видео - это количество выделенных на операцию итераций событийного цикла.