Тема: Collection v5
Показать сообщение отдельно
  #54 (permalink)  
Старый 20.08.2014, 19:21
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сегодня написал первую тестовую версию реализации "лёгких потоков" на основе прерываний (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: цифорки на видео - это количество выделенных на операцию итераций событийного цикла.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 20.08.2014 в 19:38.
Ответить с цитированием