在Common Lisp中,在后台运行函数的最佳方法是什么?具体来说,我打电话就像
(trivial-shell:shell-command "<long and complicated command>"
。这个操作阻塞了大约10秒,但是我不关心输出,只是副作用 - 所以我希望它在后台运行,这样程序流程就可以继续了。我试过在sb-thread:make-thread
中整理整件事,但这似乎没有什么区别。
如果可能的话,我会避免陷入各种复杂的线程中。我在64位Gentoo Linux上运行SBCL 1.1.18。
答案 0 :(得分:0)
我的小调查:看起来唯一的解决方案是Renzo的答案:UIOP的launch-program功能。
否则,为了运行shell命令,有
run-program
,同步。uiop:run-program
,因此它只能同步运行,答案 1 :(得分:0)
以下是SBCL上cl-async
和bordeaux-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
的参数中。