2009-10-24 3 views
14

장고보기에서 완료하는 데 몇 시간이 걸릴 수있는 프로세스를 실행해야합니다. 나는 국가를 알고있을 필요도없고 의사 소통 할 필요도 없지만 그 과정을 시작한 직후에 방향을 바꾼다는 관점이 필요하다.Django보기에서 장기 실행 프로세스를 시작하는 방법은 무엇입니까?

subprocess.Popen을 사용해 보았습니다. 새로운 threading.Thread, multiprocessing.Process 내에서 사용하고 있습니다. 그러나 부모 프로세스는 자식 프로세스가 종료 될 때까지 계속 대기합니다. 거의이되는 유일한 방법은 포크를 사용하는 것입니다. 부모가 끝날 때까지 좀비 프로세스가 끝나기 때문에 분명히 좋지 않습니다.

나는 포크를 사용할 때 할 노력하고있어 무엇 그것은 :

if os.fork() == 0: 
    subprocess.Popen(["/usr/bin/python", script_path, "-v"]) 
else: 
    return HttpResponseRedirect(reverse('view_to_redirect')) 

그래서, 최소한의 사상자와 장고보기에서 완전히 독립적 인 프로세스를 실행하는 방법이 있습니까? 아니면 내가 잘못하고있는거야?

+2

중복 : http://stackoverflow.com/search?q=%5Bpython%5D+long-running. http://stackoverflow.com/questions/1107826/python-long-running-daemon-job-processor, http://stackoverflow.com/questions/805120/python-task-server –

답변

10

이 사건에 적합한 것인지 모르겠어요, 그럼에도 불구하고 여기에 내가 할 것입니다 : 내가 (장고 모델을 통해) 작업 큐를 사용한다; 뷰가 호출되면 태스크의 새 레코드를 입력하고 행복하게 리디렉션합니다. 작업은 차례대로 django와는 독립적으로 cron에 의해 정기적으로 실행됩니다.

편집 : cron은 관련 (및 사용자 정의) django 명령을 호출하여 작업을 실행합니다.

5

우선 - 당신이 작업을 위해 cron을 사용하려고합니다. 일찍 shanyu라고 말하십시오.

당신을 적합하지 않는 경우 - 다음 장고에 대한 작업 큐, CeleryProject를 사용하려고합니다. 작동을 위해 RabbitMQ을 사용합니다. 그리고 여기이 문제에 대한 하나 개의 솔루션을 볼 수 kronos.py의 코드를 살펴 보자 내놓고 선물