2011-02-18 5 views
0

요청을 처리하는 데 특히 시간이 오래 걸리는 사이트가 있습니다 (이는 결함이 아닙니다). 거의 처리하지 않기 때문에 99 %의 시간은 꽤 빠릅니다.응용 프로그램 내부 스레드와 서버 프로세스 간의 스레드

요청을 처리하는 데 사이트가 오래 걸리면 "로드 중"이라는 메시지가 표시됩니다. 내 사이트는 mod_wsgi와 Apache를 사용합니다. 내가 보는 방식대로 처리를 완료하기 전에 '로드 중'이라고 응답하고 바로 전에 두 가지 중 하나를 수행합니다.

-spawn 처리를 처리하는 데몬 (데몬) 스레드.

- 다른 프로세스와 소켓을 통해 통신하고 처리를 처리하도록 알려줍니다 (대부분 http://localhost:8080/do_processing에게 요청 보내기).

하나의 접근 방식과 다른 접근 방식의 장단점은 무엇입니까?

답변

0

별도의 프로세스를 사용하는 것이 좋습니다. Celery (http://celeryproject.org/)와 같이 정확히하기 위해 기존 시스템을 사용할 수 있기 때문에 다른 대답에서 제안한 것처럼 전혀 어렵지 않습니다. 프로세스 스레드에서 의존하는 것은 스레드 수의 불어 나는 것을 방지하기 위해 내부 작업 큐 시스템을 구현하지 않는 한 반드시 좋은 생각은 아닙니다. 또한 다중 프로세스 서버 구성에서는 요청이 동일한 프로세스로 돌아가고 실행중인 작업의 상태를 얻는 것이 쉽지 않음을 보장 할 수 없습니다. 마지막으로, 웹 서버 프로세스가 종료되어 백그라운드 작업이 종료되기 전에 종료 될 수 있습니다. 중요한 일이라면 그러한 사건에서 생존 할 수있는 국가를 유지할 수있는 메커니즘이 필요합니다. 셀러리 같은 것을 사용하는 것이 훨씬 쉽습니다.

+0

답해 주셔서 감사합니다. 나는 너의 Blog의 팬이다! :) – primroot

+0

"요청이 동일한 프로세스로 돌아 오는 것을 보장 할 수 없습니다."그건 나에게 정말로 문제가되지 않습니다. – primroot

0

프로세스 경로에는 많은 시스템 처리가 필요합니다. 별도의 프로세스를 만드는 것은 상대적으로 비용이 많이 들고 느립니다. 그러나 프로세스가 충돌하는 경우 주 관할 프로세스에 영향을 미치지 않습니다 (종료 상태 코드가 표시되고 새로운 작업 프로세스를 다시 생성 할 수있는 기회가 주어집니다). InterProcessCommunication 레이어 (소켓, 파이프, 공유 메모리 등이 될 수 있음)가 필요합니다. 이는 프로젝트의 복잡성을 증가시킵니다.

쓰레드는 가볍고 값이 쌉니다. 공유 리소스에 대한 동시 액세스를 관리하기 만하면됩니다. 그래서 그것은 당신이 염두에두고있는 일에 달려 있습니다. 아마도 스레드가 작업을 구현하는 데 더 적합한 방법 일 것입니다.

관련 문제