Clojure агенты: ограничение скорости?
Итак, у меня есть маленький процедурный редактор SVG в Clojure.
Он имеет область кода, где пользователь создает код, генерирующий документ SVG, и панель предварительного просмотра. Панель предварительного просмотра обновляется при каждом изменении кода.
Прямо сейчас, при изменении текста, код перекомпилируется в потоке пользовательского интерфейса (Ewwwww!) И обновляется панель предварительного просмотра. Вместо этого этап компиляции должен выполняться асинхронно, и агенты, похоже, являются хорошим решением этой проблемы: попросите агента перекомпилировать код при обновлении и передать результат в область изображений.
I have not yet used agents, and I do not know whether they work with an implicit queue, but I suspect so. In my case, I have zero interest in computing "intermediate" steps (think about fast keystrokes: if a keystroke happens before a recompilation has been started, I simply want to discard the recompilation) -- ie I want a send
to overwrite any pending agent computation.
Как мне это сделать? Есть намеки? Or even a code sample? Is my rambling even making sense?
Спасибо!
2 ответа
Вы описываете проблему, которая больше связана с управлением потоком выполнения, а не с управлением общим состоянием. Следовательно, вы можете на мгновение оставить STM отдельно и посмотреть на будущее: они по-прежнему выполняются в пуле потоков как агенты, но вместо агентов их можно остановить, вызвав future-cancel
и проверка их статуса с future-cancelled?
,
Нет строгих гарантий того, что поток, выполняемый в будущем, может быть эффективно остановлен. Тем не менее, ваш код сможет попытаться отменить будущее и перейти к планированию следующей перекомпиляции.
Агенты действительно работают в очереди, поэтому каждая функция получает состояние агента и выдает следующее состояние агента. Агенты отслеживают личность с течением времени. это звучит немного больше, чем нужно, атомы немного лучше подходят для вашей задачи и используются очень похожим образом.