2016-12-25 2 views
2

Common Lisp에서 백그라운드로 함수를 실행하는 가장 좋은 방법은 무엇입니까? 특히 (trivial-shell:shell-command "<long and complicated command>"과 같은 전화를 걸었습니다. 이 작업은 ~ 10 초 동안 블로킹되지만, 출력에 대해서는 부작용이 없으므로 프로그램 흐름을 계속 진행할 수 있도록 배경에서 실행되도록하고 싶습니다. 나는 sb-thread:make-thread에 모든 것을 래핑하려고했지만 그 차이는 나타나지 않았다.Common Lisp : 백그라운드에서 함수 실행

가능한 모든 종류의 복잡한 스레딩에 신경 쓰지 않아야합니다. 저는 64 비트 젠투 리눅스에서 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

약간의 조사 : 유일한 해결책은 Renzo의 대답 인 것 같습니다 : launch-program UIOP의 기능입니다.

그렇지 않으면 쉘을 실행하기 위해 동기 run-program 같은 uiop E 개의

0

uiop:run-program를 사용 SBCL에 cl-asyncbordeaux-thread 패키지와 예입니다. 현재 디렉토리에 쉘 스크립트 ./echo.sh이 있다고 가정하십시오. 백그라운드에서 스크립트를 실행할 수 있습니다. 스크립트를 호출 한 후 다음 코드가 즉시 평가되므로 화면에 Waiting.....이 표시됩니다. 스크립트가 완료된 후 알리미가 트리거되고 표시됩니다. Threaded job done.

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

당신이 쉘 스크립트의 표준 출력을 캡처 sb-ext:run-program의 인수에 :output t을 추가합니다.