从 Emacs 多线程错误中保存 SBCL 图像

Posted

技术标签:

【中文标题】从 Emacs 多线程错误中保存 SBCL 图像【英文标题】:Saving SBCL Image From Emacs Multiple Threads Error 【发布时间】:2018-06-25 05:46:36 【问题描述】:

我一直在尝试保存正在运行的 Common Lisp 图像,以节省重启时的时间并提高开发效率。但是,当我在 Emacs/SLIME 中运行以下命令时,我遇到了一些问题:

(sb-ext:save-lisp-and-die "rest-api-image" :purify t)

我收到以下错误。显然,它抱怨看到多个线程。据我所知,这些不是我以编程方式创建的线程。相反,这些是 Lisp 和 Emacs 创建的。这里有解决方法吗?图片还能保存吗?

Cannot save core with multiple threads running.

Interactive thread (of current session):
  #<THREAD "main thread" RUNNING 1000550853>

Other threads:
  #<THREAD "Swank Sentinel" #1=waiting on:
       #<WAITQUEUE  1004AB8003>
     1004AB4753>,
  #<THREAD "control-thread" #1#
       #<WAITQUEUE  1005BC54D3>
     1004D87F03>,
  #<THREAD "reader-thread" RUNNING 1004D88063>,
  #<THREAD "swank-indentation-cache-thread" #1#
       #<WAITQUEUE  1004D980E3>
     1004D88183>,
  #<THREAD "auto-flush-thread" RUNNING 10022FFDA3>,
  #<THREAD "repl-thread" RUNNING 1002300003>
   [Condition of type SB-IMPL::SAVE-WITH-MULTIPLE-THREADS-ERROR]
See also:
  SBCL Manual, Saving a Core Image [:node]

【问题讨论】:

【参考方案1】:

Cookbook 为您介绍:https://lispcookbook.github.io/cl-cookbook/scripting.html

涉及的步骤是:

(load "my-app.asd")
(ql:quickload :my-app)
(sb-ext:save-lisp-and-die #p"my-app-binary" :toplevel #'my-app:main :executable t)

所以这是一个可能的 Makefile 目标:

build:
    sbcl --load my-app.asd \
         --eval '(ql:quickload :my-app)' \
         --eval "(sb-ext:save-lisp-and-die #p\"my-app\" :toplevel #my-app:main :executable t)"

但是使用 asdf 这样做是可移植的。将此添加到您的 .asdf 系统定义中:

:build-operation "program-op" ;; leave as is
:build-pathname "<binary-name>"
:entry-point "<my-package:main-function>"

然后

(asdf:make :my-package)

使用其网络服务器构建一个网络应用程序是一步。

要解析命令行参数,捕获C-c,将所有内容放在 CI 上,请参阅 Cookbook!

ps:如果你需要在一个简单的 sbcl repl 中尝试一下,看看cl-repl,甚至是sbcli,它们比rlwrap sbcl 更好。

【讨论】:

【参考方案2】:

保存图像的典型方法是从命令行启动 SBCL(不是从 Emacs 中用于 SLIME),加载您想要在图像中显示的内容,然后立即保存图像。这可确保在尝试保存时不存在由 SLIME 或其他正在运行的进程/线程建立的状态或线程。

我通常会编写一个简短的 Lisp 文件来执行此操作,最终的表单会调用 save-lisp-and-die

【讨论】:

【参考方案3】:

如果我没记错的话,我遇到了类似的错误,但我仍然设法保存了图像。我用了trivial-dump-core这个包。

它会引导您在 Emacs 中转到缓冲区 *inferior lisp* 并运行表达式 (trivial-dump-core::sbcl-dump-image-slime "sbcl-slime")

【讨论】:

以上是关于从 Emacs 多线程错误中保存 SBCL 图像的主要内容,如果未能解决你的问题,请参考以下文章

c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?

在循环中保存图像比多线程/多处理更快

Emacs 26的多线程探索

使用多线程处理和保存图像

Arcengine中多线程的问题,我需要在子线程中创建要素并保存。但按下面的写总是停止运行,不知道哪有错误

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存