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?,

Нет строгих гарантий того, что поток, выполняемый в будущем, может быть эффективно остановлен. Тем не менее, ваш код сможет попытаться отменить будущее и перейти к планированию следующей перекомпиляции.

Агенты действительно работают в очереди, поэтому каждая функция получает состояние агента и выдает следующее состояние агента. Агенты отслеживают личность с течением времени. это звучит немного больше, чем нужно, атомы немного лучше подходят для вашей задачи и используются очень похожим образом.

Другие вопросы по тегам