2009-07-25 7 views
3

사용자가 상당히 오래 실행되는 프로세스 (5 ~ 30 초)를 시작할 수있는 응용 프로그램을 작성하려고합니다. 그런 다음 사용자는 생성 된 프로세스의 출력을 확인할 수 있어야합니다. 출력은 사용자의 현재 세션에만 필요하므로 장기간 저장할 필요가 없습니다. 철탑 컨트롤러 이와 같은Pylons에서 백그라운드 프로세스를 시작하려면 어떻게해야합니까?

  1. 백그라운드 프로세스를 시작하는 가장 좋은 방법은 무엇입니까 : 나는 어떻게 철탑 프레임 워크의 활용이 동안 수행에 관한 두 가지 질문이 있습니까?

  2. 백그라운드 프로세스의 결과를 사용자에게 다시 돌려주는 가장 좋은 방법은 무엇입니까? (I 등, 세션 데이터, 데이터베이스에 출력을 저장해야합니까?)

편집 : 문제는 서브 프로세스 내가 컨트롤러 subprocess을 사용하여 명령을 실행하는 경우, 컨트롤러 대기입니다 프로세스가 완료 될 때까지로드중인 빈 페이지를 사용자에게 보여주기 위해 계속하기 전에 완료해야합니다. 하위 프로세스를 시작한 직후 사용자를 상태 페이지로 리디렉션하여 자체적으로 완료 할 수 있기를 원합니다.

답변

6

제 2 프로세스를 데몬으로 처리하여이 문제를 (HTTP를 통해 장기 실행 프로세스에서) 처리했습니다. Pylons 컨트롤러는 두 번째 프로세스 (필요한 데이터를 전달)에 시스템 호출을하고 두 번째 프로세스는 즉시 데몬이됩니다. 이렇게하면 시스템 호출이 끝나고 컨트롤러가 돌아올 수 있습니다.

내 웹 응용 프로그램은 일반적으로 완료 될 때까지 데몬 프로세스를 "확인"하기 위해 AJAX 요청을 실행합니다. 나는 tmp 파일 (cPickle이 잘 작동 함)과 데이터베이스를 사용하여 데몬과 웹 응용 프로그램간에 정보를 공유했습니다.

우수 파이썬 데몬 조리법 : http://code.activestate.com/recipes/278731/

+0

이 문제가 발생합니다. 안전한가요? 매분 10000 명의 사용자가 있다면 어떻게 될까요? 그리고 대부분의 요청은 매우 비쌉니까? 그럼 많은 데몬을 운영할까요? 또한 데몬 파일 프로세스를 실행하는 것이 좋습니다. 감사. – User007

+0

안전한가요? 예, 저는 이것을 수년간 프로덕션 환경에서 사용해 왔습니다. 데몬 프로세스가 깨끗하게 종료되는지 확인하십시오.하지만 내 부하는 * 시간당 * 사용자 수만 명입니다. 시간당 10,000 명의 사용자가 장시간 실행하는 프로세스를 안전하게 실행할 수있는 방법이 있습니까? 서버가 메모리/CPU 사용량을 처리 할 수 ​​있습니까? 두 번째 프로세스를 포크하지 않은 경우 웹 서버 설치 프로그램도 처리 할 수 ​​있습니까? – Mark

1

필자는 이것이 파일론과 관련이 없다고 생각합니다. 나는이 단계에서 (어떤 프레임 워크에서든) 다음 작업을 수행 할 것입니다 :

    새로운 작업에 대한 ID를 생성하고 데이터베이스에 레코드를 추가하십시오.
  • 새 프로세스를 생성하십시오. 서브 프로세스 모듈을 통해 명령 행 (*)에 ID를 전달하십시오.
  • 프로세스가, 철탑에서 /tmp/project/ID
  • 에 출력을 쓰기 형태 /job/ID 또는 /job?id=ID의 URL을 구현할 수있다. 그러면 작업이 완료되었는지 여부를 데이터베이스로 조사하고 임시 출력을 페이지에 병합합니다.

(*) 하위 프로세스가 다른 프로세스를 즉시 생성하고 파일 프로세스가 첫 번째 자식을 기다리면 좀비 프로세스가 없어지는 것이 더 좋을 수 있습니다.

+0

예측 가능한 임시 파일 이름은 종종 안전하지 - 그들은 당신의 웹 서버가 쓰기 권한을 가지고있는에 임의의 파일을 덮어 악용 될 수 있습니다./var 아래에 미리 만들어진 디렉토리 (적절한 사용 권한을 가짐)를 사용하는 것이 좋습니다. –

관련 문제