2012-11-20 6 views
2

웹 인터페이스 (Flask)에서 시작하는 다소 큰 데이터베이스 가져 오기 작업이 있습니다. 데이터베이스 가져 오기를 트리거하는 URL을 방문하면 데이터베이스 삽입을 수행하기 전에 포크를 실행합니다.Python 및 Flask의 장기 실행 작업

문제점은 웹 서비스 (내장 된 개발 서버에서 Ctrl + C)를 중지하려고 할 때 자식 프로세스가 대신 중지되고 웹 서버가 백그라운드에서 계속 실행된다는 것입니다. 어쨌든 마치 자식 프로세스가 현재 주 프로세스 인 동안 웹 서버 작업이 갑자기 백그라운드 데몬이되는 것처럼 보입니다.

내가 달성하고자하는 것은 웹 서버가 자식 프로세스를 시작한 다음 다시 예외를 적용하지 않는 "시작 자식 프로세스 및 그 다음이를 잊어 버리는"접근 방법입니다. 특히 예외 및 이와 유사한 경우에는 신경을 써야합니다.

가장 좋은 방법에 대한 아이디어가 있으십니까?

현재 가져 오기 기능에 대한 테스트 코드는 다음 코드와 함께 플라스크 경로 처리기에서 시작됩니다

def import_start(): 
    try: 
      pid = os.fork() 
    except OSError as e: 
      print "Exception in import_start" 
      sys.exit(1) 
    if pid == 0: 
      with open("/tmp/web_out.txt", "w") as f: 
       for x in range(100): 
         f.write("line %d\n" % (x)) 
         f.flush() 
         sleep(10) 

:

import_start() 

나중에 import_start를 죽일 것이다 Ctrl + C를 사용하여() 프로세스를 웹 서버 대신 사용하십시오. 두 프로세스가 출시 후 서로 완전히 독립적이어야하므로 다른 방법으로 사용하고 싶습니다.

UPDATE :

def start_import(): 
      subprocess.Popen([sys.executable,__file__],stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 

def do_import(): 
    with open("/tmp/web_out.txt", "w") as f: 
      for x in range(100): 
        f.write("line %d\n" % (x)) 
        f.flush() 
        sleep(10) 

if __name__ == "__main__": 
    do_import() 

이 (내 웹 서버가 살해되어 생성 된 프로세스를 죽이는 제외) 작동하지만가 청소하지에 대해 조금 걱정 : 내가하고 결국

여하튼 과정. 이 문제를 해결하기 위해 MQ 접근 방식을 살펴볼 수도 있습니다.하지만 이는 새로운 프로세스를 생성하는 것보다 더 복잡합니다.

+0

당신은 당신의 작업을 셀러리에 맡기고 플라스크 만 작업 스케줄을 잡아야합니다. 그러면 서버로 수행 할 작업을 http://usheryproject.org/ – dm03514

+0

할 수 있습니다.하지만, 과제를 잊어 버리면 별도의 도서관이 필요하겠습니까? 아마 subprocess.Popen 그냥 import_start 함수를 호출하는 대신 외부 실행 파일로 스크립트를 실행하면 쉽게 (덜 영리한) 작업을 할 수 있습니까? – agnsaft

+0

문제 해결 : 필자의 특별한 솔루션은 신호를 기다리는 별도의 데몬을 갖기 위해 Postgresql LISTEN/NOTIFY를 사용합니다. 그런 다음 웹 응용 프로그램은 가져 오기를 시작하기 위해 NOTIFY 만 필요합니다. – agnsaft

답변

3

python-daemon이 도움이 될 수 있습니다. 이것은 주로 파이썬 프로그램을 데몬으로 시작하는 데 사용됩니다. Afaik는 이중 포크 마법을 사용하고 현재의 과정에서 프로세스를 분리합니다.

관련 문제