Итерация которую можно прервать

Tagged as actors, commonlisp, ai

Written on 2026-05-16

Итерация которую можно прервать. С акторами не всё так просто.

Вот вам небольшая демка того, как в системе акторов можно реализовать итерацию таким образом, чтобы её можно было безопасно прервать. Я собираюсь использовать этот подход для того, чтобы организовать работу с код-ассистентом и тулами, которые он запускает. Это нужно сделать так, чтобы код-ассистента можно было прервать в любой момент и сделать это безопасно.

В этом демо используется фреймворк Sento, реализующий актеры для Common Lisp.

Вот полный код примера:


(defun make-interruptable-actor-loop-example ()
  (ac:actor-of *sys*
               :destroy (lambda (&rest args)
                          ;; По сообщению :stop актор будет полностью
                          ;; остановлен и его нельзя будет запустить ещё раз
                          (log:info "Destroy called with ARGS = ~A" args))
               :receive (let ((stopped nil))
                          (lambda (message)
                            (log:info "Processing" message)
                            (case message
                              ;; Но с помощью :break итерацию можно приостановить,
                              ;; а потом продолжить заново с помощью :run.
                              (:break
                                 (log:info "Stopping")
                                 (setf stopped t))
                              (:run
                                 (log:info "Running")
                                 (setf stopped nil)
                                 (act:tell act:*self* :next-iteration))
                              (t
                                 (unless stopped
                                   (log:info "Sleeping")
                                   (sleep 3)
                                   (log:info "Going to next iteration")
                                   (act:tell act:*self* :next-iteration))))))))

Created with passion by 40Ants