2016-12-25 11 views
2

Common Lispのバックグラウンドで関数を実行する最も良い方法はありますか?具体的には、 (trivial-shell:shell-command "<long and complicated command>"のような電話をかけています。この操作は約10秒間ブロックされますが、出力は気にしません。副作用だけです。バックグラウンドで実行したいので、プログラムの流れを続けることができます。私はsb-thread:make-threadに全体をラップしようとしましたが、それは違いを生じさせていませんでした。Common Lisp:バックグラウンドでの関数の実行

可能であれば、あらゆる種類の複雑なスレッディングに巻き込まれないようにしたいと思います。 64ビットGentoo LinuxでSBCL 1.1.18を実行しています。

+1

トリビアル・シェルは古いものであり、初歩的な(http://www.cliki.net/trivial-shell)パッケージです。あなたは[launch-program in UIOP](https://gitlab.common-lisp.net/asdf/asdf/tree/master/uiop) – Renzo

+1

"のような他の解決策を試すことができますが、それは違いを生むようには見えませんでした。 "あなたのSBCLのインストールはスレッドをサポートしていますか? ':sb-thread'が' * features * 'に属しているかどうかをチェックします(または単にREPLの'#+ sb-thread t'を評価します)。 Tが返された場合は、スレッドを開始できるはずです。 – coredump

答えて

0

私の少しの調査:レンゾの答えはUIOPのlaunch-programの機能だと思われます。シェルを実行するために、それ以外の場合は

run-program、同期のようなUIOPの

0

uiop:run-programを使用していますSBCLのcl-asyncbordeaux-threadパッケージとの一例です。カレントディレクトリにシェルスクリプト./echo.shがあるとします。バックグラウンドでスクリプトを実行できます。スクリプトの呼び出し後、すぐに次のコードが評価され、Waiting.....が画面に表示されます。スクリプトが完了すると、通知機能が起動され、表示されますThreaded job done.

に@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......~%")) 

あなたは、シェルスクリプトの標準出力をキャプチャsb-ext:run-programの引数に:output tを追加したい場合。

関連する問題