Common Lisp:在后台运行函数

时间:2016-12-25 06:39:52

标签: multithreading shell common-lisp sbcl

在Common Lisp中,在后台运行函数的最佳方法是什么?具体来说,我打电话就像 (trivial-shell:shell-command "<long and complicated command>"。这个操作阻塞了大约10秒,但是我不关心输出,只是副作用 - 所以我希望它在后台运行,这样程序流程就可以继续了。我试过在sb-thread:make-thread中整理整件事,但这似乎没有什么区别。

如果可能的话,我会避免陷入各种复杂的线程中。我在64位Gentoo Linux上运行SBCL 1.1.18。

2 个答案:

答案 0 :(得分:0)

我的小调查:看起来唯一的解决方案是Renzo的答案:UIOP的launch-program功能。

否则,为了运行shell命令,有

答案 1 :(得分:0)

以下是SBCL上cl-asyncbordeaux-thread个包的示例。假设您在当前目录中有一个shell脚本./echo.sh。您可以在后台运行脚本。调用脚本后,将立即评估以下代码,以便在屏幕上显示Waiting.....。脚本完成后,会触发通知程序并显示Threaded job done.

确保*features*包含SB-THREAD,如@coredump所说。

(require 'cl-async)
(require 'bordeaux-threads)

(as:with-event-loop()
  (let ((notifier (as:make-notifier
                    (lambda ()
                       (format t "Threaded job done.~%")
                       (as:exit-event-loop)))))
    (format t "App started.~%")
    (bt:make-thread (lambda ()
                       (sb-ext:run-program "/bin/bash" (list "./echo.sh"))
                       (as:trigger-notifier notifier))))
  (format t "Waiting......~%"))

如果要捕获shell脚本的标准输出,请将:output t添加到sb-ext:run-program的参数中。