таймеров с приоритетами
Задача: есть N независимых задач с периодическими таймерами; обработкой занимается общий пул потоков. По истечении времени прикреплённая к таймеру задача добавляется в очередь пула, обновляется некоторое состояние, а сам таймер с обновлённой задачей добавляется в "конец" очереди таймеров.
Сложности:
> Период может различаться
> Запуск таймеров тоже происходит не одновременно
> Таймеры могут добавляться и удаляться
Моя идея: поток-слушатель + min-heap, отсортированная по времени ожидания до ближайшего срабатывания + дополнительный флаг delete_pending в контексте каждого таймера, чтобы не усложнять удаление (т.е. таймер будет удалён не сразу, а при следующем срабатывании)
Максимальное число таймеров: несколько тысяч
почему таймер не может просто по истечению времени делать что то + задавать ещё одну задачу рекурсивно (сделать Х через время N)? На буст азио таймере во всяком случае такое делается легко
Практика показала - с несколькими тысячами таймеров при близком времени срабатывания системе становится нехорошо
Собственно...))
я так понимаю, это добро у вас еще где-то в драйверах болтается?
тысячи таймеров. если не секрет, це драйвер от чего?
ну либо так либо таймерные колеса
Подробности раскрыть не могу :( К каждому создаваемому процессу, соответствующему некоторому критерию, прикрепляется таймер с периодической задачей анализа VAD
Если тайм-аут ограничен можно сделать что то вроде хэша по времени. Например ограничение час, делаем 3600 интрузивных списков. При установке таймера кладём в соответствующий список, обработчик просто ходит циклически по слотам инкрементируясь на секунду. Добавление/удаление и expiration O(1). Оно даже если тайм-аут превышен тоже будет работать, просто чуть менее эффективно (при обходе в списке expired надо будет фильтровать те которые через час-два и т.д.)
По сути - timer wheel же и есть :)
А, ну так всё уж расписано :) да, точно, оно.
добавление и удаление случайно не O(N/3600) будут?) Хотя не знаю что вы подразумеваете под интрузивным списком
Простой связный список который содержит все события которые экспайрятся в эту секунду.
Я когда написал немного не дочитал. Я имел ввиду пожалуйста не надо прям в тредпуле делать отложенный запуск, не раз с таким сталкивался, работает плохо, и непонятно зачем так делать
Не совсем понял. Срабатывание таймера обработано потоком X (путь это DPC или мой поток) -> пихаем задачу/коллбэк в очередь пула...
Обсуждают сегодня