2013-09-23 1 views
1

일종의 병렬 컴퓨팅, 즉 다른 계산을 위해 많은 프로세스를 시작한 다음 결과를 구성하기 위해 모든 프로세스가 종료 될 때까지 대기하기 위해 emacs/ielm의 프로세스를 실험하고 있습니다. 이를 위해 나는 다음과 같은 간단한 기능 설정 :이맥스 프로세스 목록이 작동하지 않는 것 같습니다.

    :

    (defun testp() 
        (while (> (length (process-list)) 1))) 
    

    내가 다시 컨트롤을 얻을 때 나는 모든 어린이 프로세스가 시작된 후 testp에 전화를, 나는 결과를 구성

  1. 하위 프로세스가없는 경우 testp가 즉시 종료됩니다. ok;
  2. 하나 이상의 하위 프로세스 testp가있는 경우 루프가 수행됩니다. ok;
  3. 모든 하위 프로세스가 완료되면 testp는 계속 루핑을 계속하며 이는 이 아닙니다.

내가 잘못 된 점을 이해하도록 도움을 요청할 수 있습니다.

+0

# 3의 경우'C-g '을 사용하여'(testp)'를 중단 할 때'(process-list)'가 평가하는 것은 무엇입니까? – user4815162342

답변

0

아마도 빡빡한 루프가 이맥스가 적절한 프로세스 정리를하지 못하게 할 수 있습니다. 제 추천은 (process-list)의 결과에 필터를 적용하는 것입니다 (실행하는 컴파일, 서버, 쉘 등 프로세스 목록이 비어 있지 않을 것이기 때문에). 관심있는 다른 프로세스를 필터링하고, while (예 : (sleep 0 500))에 작은 지연을 추가 할 수도 있습니다.

2

프로세스가 완료되면 즉시 삭제되지는 않습니다. 그래서 (process-list)은 여전히 ​​그것을 나열 할 수 있습니다. 사용자 변수 delete-exited-processes이이를 제어하므로 t으로 설정했는지 확인하십시오. 함수 list-processes은 완성 된 프로세스를 명시 적으로 삭제하므로 유용 할 수 있습니다.

자세한 내용은 설명서의 processes 장을 확인하십시오.

2

Emacs는 단일 스레드이며 "안전 지점"에 도달 할 때까지 외부 입력 (예 : 프로세스 상태의 변경)을 처리하지 않습니다. 그래서 위의 루프 (@juanleon이 암시 하듯이)는 너무 빡빡합니다. 그것에 sleep을 추가하려고합니다.

그러나 더 나은 것은 set-process-sentinel을 사용하여 프로세스가 종료 될 때마다 Emacs가 종료 될 때 알려주도록하는 것입니다. 내가 위에서 my-list-of-running-processes을 사용하는 이유 는 예컨대 : 당신은 아마 관련이없는 프로세스를 포함 할 수 있기 때문에 (당신이 M-x shell 또는 다양한 다른 일을 사용하는 경우, 예를 들어)를 process-list를 사용하지 않는 것이 또한

...start a new process stored in proc... 
    (push proc my-list-of-running-processes) 
    (set-process-sentinel proC#'my-run-when-its-over) 
    ... 

(defun my-run-when-its-over (proc msg) 
    (setq my-list-of-running-processes (delq proc my-list-of-running-processes)) 
    (unless my-list-of-running-processes 
    (message "Haha! all my processes are done!"))) 

참고하는 것입니다.

관련 문제