2013-08-21 1 views
1

현재 파이썬에서의 계산이 끝난 후 계산을 수행하고 싶습니다. 필자의 파이썬 인터프리터는 emacs를 통해 실행됩니다.파이썬과 스케줄링 계산

예를 들어 나는 현재 실행하고 :

>>> for i in range(2, 5): 
...  tn.TweetNetwork.create_subnetworks(i) 
... 

나는 간단한 실수를 range(1,5)를 입력하기위한 것. 이 작업은 최소 4 시간 이상 실행되었으며 다른 몇 시간 동안 실행해야합니다. 그것은 내가 수정과 함께 루프를 다시 실행하고 계산 된 모든 것을 잃고 싶지 않다고 말했다.

24/7 컴퓨터가 아니기 때문에`tn.TweetNetwork.create_subnetworks (1) '함수를 실행하도록 Python을 어떻게 스케줄 할 수 있습니까?

나는 이맥스 24.3 및 우분투 12.04 LTS를 사용하여 더 많은 정보가 필요하면 알려주십시오. 모든 도움은 대단히 감사합니다!

EDIT : 나는 답을 게시했지만, PID를 찾는 방법을 모르겠다. 나는 이맥스를 통해 파이썬 인터프리터를 돌리고있다. 그럼 내가 어떻게 알아낼 수 있니?

+2

실제로 다음 파이썬을 예약해야하나요 명령을 실행하거나 현재 명령이 끝나 자마자 실행됩니까? 후자의 경우, Python 버퍼에 명령을 입력하고 Enter 키를 누릅니다. 현재 명령을 마자 마자 파이썬으로 보내질 것입니다. 적어도 Emacs는 쉘이나 R 터미널 버퍼에서 작동합니다. bash 쉘이나 comint-mode 기반의 Python 모드를 사용하고 있다면, 같은 방식으로 동작해야합니다. – Tyler

+0

아마도 완전히 다른 접근 방식입니다 : 실행중인 작업이 CPU에 많은 부하를 걸었을 때 (맨 위 명령과 같이) 부하가 충분히 길어지면 다른 작업을 시작할 수 있습니다 :) – benjamin

답변

0

제가 생각하기에 가장 쉬운 방법은 프로세스가 끝나고 tn.TweetNetwork.create_subnetworks(1)이 실행될 때까지 기다리는 또 다른 스크립트를 작성하는 것입니다. create_subnetworks이 전역 변수에 액세스하지 않고 모든 결과를 데이터베이스/파일/etc에 쓰는 경우에만 작동합니다. SSH하여 컴퓨터에

# Write script similar to these 
import os, time 

print "Wait until old script completed..." 
while os.path.exists("/proc/SCRIPT_PID"): 
    time.sleep(1) 

print "Execute create_subnetworks..." 
tn = ... 
tn.TweetNetwork.create_subnetworks(1) 

연결은 ps axu | grep script_name에 의해 프로세스 ID를 얻을이 새로운 스크립트를 실행합니다.

+0

어떻게 수행합니까? SCRIPT_PID가 표시됩니까? 나는 이맥스에서 뛰고있다 ... – CodeKingPlusPlus

+0

부랑자'C-x C-f/ssh : user @ server : /'로 시작하여'M-x eshell'을 시작하고'ps axo pid, command | grep running_script_name'. – werehuman

+0

나는'running_script_name'이라는 의미를 모르겠다. 나는 모듈을 임포트 한 다음 인터프리터에서 모듈의 함수를 실행한다. – CodeKingPlusPlus

1

댓글에 너무 많았지 만 이는 완전한 답변이 아닙니다.(process-id (get-process "name-of-the-process")) :

  • 당신이
  • M-의 ID를 얻으려면 프로세스를 식별,

    1. M-X의 목록 - 프로세스 :

      이맥스 시작 프로세스를 얻으려면.

    하지만 이것은 인터프리터의 프로세스를 제공 할 것이고, 다른 프로세스는 인터프리터에서 시작하지 않을 것입니다.

    당신이 모든 프로세스를 얻을 필요가있는 경우

    그 과정을 통해 양산 할 수있다 :

    $ pstree PID 
    

    PID 당신이 이맥스에서 이전에 얻은 하나입니다.

  • 0

    타일러 댓글이 도움이되지 않는 경우, 다음 코드 조각 평가 후면 수

    (defun foo (ignored) 
        (remove-hook 'comint-output-filter-functions 'foo) 
        (run-with-timer 1 nil (lambda() 
              (goto-char (point-max)) 
              (insert "tn.TweetNetwork.create_subnetworks(1)") 
              (comint-send-input)))) 
    
    (add-hook 'comint-output-filter-functions 'foo) 
    

    그것은 당신이 파이썬 열등 버퍼에 삽입하는 데 필요한 명령을 삽입하는 함수를 정의의 후 두 번째 그 함수의 호출 (지연은 재귀 루프를 피하기위한 것이다).

    그런 다음 열등한 프로세스 (귀하의 경우에는 파이썬)가 아무 것도 쓰지 않는 이벤트에서 해당 함수 호출을 설정합니다.귀하의 경우, 그건 ">>>"프롬프트, 파이썬 준비가되면 씁니다. 코드가 출력을 생성하는 경우이 방법은 작동하지 않습니다.

    다른 버퍼에 COMINT를 사용하는 경우 (쉘, SQL은, ...) 당신이 할 필요가있을 것이다 (make-variable-buffer-local 포함) 파이썬 대화 형 버퍼 지역 comint-output-filter-functions 변수

    +0

    emacs white-magic ^^ – benjamin