【问题标题】:Recompiling a CL system as it is running在运行时重新编译 CL 系统
【发布时间】:2017-04-30 19:59:16
【问题描述】:

我正在运行一个常见的 lisp 项目,该项目每 5 秒获取一次市场数据。我对代码进行了一些调整,并希望在生产环境中对其进行更新。事件循环真的很标准:

(loop
   (fetch-data)
   (sleep 5))

由于 loop 的阻塞性质,我没有 REPL 可供使用。

我的问题:我可以动态更新正在运行的代码吗?

我知道我可以用(asdf:compile-system :system-name)重新编译项目

我也知道我可以redefine classes at runtime。 (并不是说我在我的实现中使用类)

但是现在我不能使用 REPL,我必须以某种方式将环境加载到另一个 REPL 中。有没有办法做到这一点? (我正在使用 SBCL)

在我看来,最简洁的方法就是实现异步数据获取。

【问题讨论】:

  • 您在哪个平台上运行?你可以用 Control+C 打断并重新编译吗?
  • 我正在使用 SBCL。我知道我可以打断,但这样我的数据就会有缺口。
  • 您是否在自己的线程中运行循环?
  • 我不会编译正在运行的程序中的代码。我会在其他地方编译它并加载编译后的代码。
  • @coredump 不。但我想这是一种解决方案。 :)

标签: common-lisp read-eval-print-loop sbcl


【解决方案1】:

由于循环的阻塞性质,我无法使用 REPL。

有办法解决它:

  • 以自己的thread 启动循环。
  • 或在你的 Lisp 中连接类似 SLIME to a running SWANK 的东西
  • 或者您的循环可以定期检查代码更新

我也不会编译程序内部的代码,除非您知道代码实际上可以编译或者您可以处理编译错误。编译和加载通常也比加载慢。

请注意,将代码加载到正在运行的程序中并不是标准化的。使用 SBCL,您不仅可以拥有线程,而且这些线程可以同时运行。有些更改可能不是线程安全的,或者会导致正在运行的程序出现问题。因此,您需要计划要进行什么样的更改。

简化代码更改的一件事:在循环休眠时加载更新,如果在 5 秒窗口内可能的话。

某些程序可能需要更多架构,例如在更新程序的某些部分时关闭这些部分的能力。

【讨论】:

  • 谢谢。您能否举例说明正在运行的程序如何检查自身是否有更新。可以是非常高级的代码示例。
  • @tsikov: 原始:检查某个目录中是否存在 fasl 文件,如果存在,加载它然后将其移走...
【解决方案2】:

不确定这是否适用于您的情况,但我已经非常成功地使用了循环中的 swank::handle-request 调用,以便通过正在运行的交互式应用程序进行 REPL:

(defun handle-swank-requests ()
  (let ((connection (or swank::*emacs-connection* 
                        (swank::default-connection))))    
    (when connection      
      (swank::handle-requests connection t))))

(defun main-cycle () 
  (loop
     (restart-case
         (progn
           (handle-swank-requests)
           (fetch-data)
           (sleep  5))
       (continue () :report "Continue" (print "Continued after error from SWANK")))))

restart-case 构造允许在错误时不中断循环,并在错误得到修复后继续循环。

我不确定这种方法是否防弹,AFAIK swank 默认使用线程处理请求,因此可能存在一些同步问题,因此可能不适用于生产用途,用于开发/调试。

AFAIK CEPL 使用类似的东西,可能是更复杂和强大的版本。也不错CEPL demo video

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    相关资源
    最近更新 更多