【问题标题】:Common Lisp: Run function in the backgroundCommon Lisp:在后台运行函数
【发布时间】:2016-12-25 06:39:52
【问题描述】:

在 Common Lisp 中,在后台运行函数的最佳方式是什么?具体来说,我正在打电话 (trivial-shell:shell-command "<long and complicated command>"。此操作阻塞了约 10 秒,但我不关心输出,只是副作用 - 所以我希望它在后台运行,以便程序流程可以继续。我尝试将整个内容封装在 sb-thread:make-thread 中,但这似乎并没有什么不同。

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

【问题讨论】:

  • Trivial-shell 是一个旧的 rudimentary 包。您可以尝试其他解决方案,例如launch-program in UIOP
  • “但这似乎没有什么不同。”。您安装的 SBCL 是否支持线程?检查:sb-thread 是否属于*features*(或简单地在REPL 中评估#+sb-thread t)。如果它返回 T,那么你应该能够启动线程。

标签: multithreading shell common-lisp sbcl


【解决方案1】:

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

否则为了运行shell命令有

【讨论】:

    【解决方案2】:

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

    确保*features* 包含@coredump 所说的SB-THREAD

    (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的参数中。

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多