2009-06-01 6 views
0

이것은 다소 까다로운 질문입니다.파이썬 Mod_WSGI 출력 버퍼

저는 python에서 mod_wsgi로 작업 중이며 지속적으로 HTML을 생성하는 출력 버퍼를 만들고 싶습니다 (페이지로드가 완료 될 때까지).

지금은 응용 프로그램() 함수가 페이지 코드에 대해 별도의 '페이지'스레드를 생성 한 다음 바로 직후에 파이썬의 큐 라이브러리를 사용하여 출력 버퍼에 대한 연속 루프를 실행하도록 스크립트를 설정했습니다.

이 방법을 설정하는 더 좋은 방법이 있습니까? Output Buffer를 페이지 대신에 쓰레드라고 생각했는데, 문제는 Application() 함수가 Apache에게 HTML을 전달할 수있는 유일한 함수라는 것입니다. (필자가 말할 수있는 한, 이 아이디어를 불가능하게 만든다).

내 현재 설정에서 볼 수있는 단점은 오류가 발생했을 때 버퍼를 잠시 중단하고 페이지 스레드가 계속 잠기지 않고 종료 할 수 없다는 것입니다.

(mod_wsgi에는 출력 버퍼를 빌드 할 필요가 없으므로 전체 페이지를로드 한 다음 출력을 한 번만 보내면 훨씬 느린 페이지로드가 발생합니다.)

답변

2

은 (그것은 좀 mod_wsgi에 다음, 나는 전체 페이지를로드 싫어이 문제를 처리하기 위해 출력 버퍼에 빌드가 발생하지 않는 것을 짜증 작동 출력을 한 번만 보내면 훨씬 느린 페이지로드가 발생합니다).

일종의 스트리밍 또는 비동기 응용 프로그램을 사용하는 경우가 아니면 전체 페이지를 한 번에 99.9 % 보내려합니다. 내가 생각할 수있는 유일한 예외는 웹 페이지를 전송하는 것입니다 (큰 것은 수백 메가 바이트입니다).

내가 언급 한 이유는 성능 문제가있는 경우 출력 버퍼링 때문이 아니라는 점입니다.

def Application(environ, start_response): 
    start_response('200 Ok', [('Content-type','text/plain')]) 
    response = [] 
    response.append('<h1>') 
    response.append('hello, world!') 
    response.append('</h1>') 
    return [''.join(response)] #returns ['<h1>hello, world!</h1>'] 

가장 좋은 방법은 메시지의 덩어리를 잡고 나서 같은 문자열에 함께 가입 목록 같은 가변 데이터 구조를 사용하는 것입니다 :이 처리하는 가장 간단한 방법은 같은 것을 할 것입니다 위에했다. 특별한 도움이 필요하다면이 방법이 최선의 방법 일 것입니다.

+0

청크 분할 웹 사이트를 전송할 때마다 페이지로드가 시작되기 전에 컴파일이 완료 될 때까지 기다리지 않고 항상로드가 빨라지므로이 방법이 맘에 들지 않습니다. 최종 결과는 정체 된로드 시간입니다. – Ian

+0

또한 오류로 인해 출력이 0이되므로 (디버깅이 매우 까다로울 수 있기 때문에) 개발이 더 성가 시게 만듭니다. – Ian

+0

@Ian - 것은 어쨌든 TCP/IP에 의해 페이지가 청크 될 것입니다.페이지를 생성하는 데 시간이 오래 걸린다면 페이지를 청크하는 것이 합리적입니다. 그러나 대부분의 페이지는 그렇지 않습니다. 대부분의 경우, 한 페이지가 네트워크를 통해 전송되기 전에 수백만 또는 수십억 번이 아니라면 문자 그대로 수천 페이지를 생성 할 수 있습니다. 페이지를 생성하기 위해 데이터베이스를 쿼리하는 경우에도 마찬가지입니다. 다른 말로하면, 얻을 수있는 속도 이점은 무시할 수 없을 것입니다. 따라서 가장 단순한 작업을 수행하는 것이 좋습니다. –

2

mod_wsgi는 Generators를 지원해야합니다. 당신이 CherryPy 같은 프레임 워크를 사용하는 경우 그래서 당신은 할 필요가 : 각각의 수율이 사용자에게 페이지의 덩어리를 반환합니다

def index(): 
    yield "Some output" 
    #Do Somemore work 
    yield "Some more output" 

. 여기

이 구현에 CherrPy에서 몇 가지 기본 사항이며 어떻게 http://www.cherrypy.org/wiki/ReturnVsYield

+0

그게 정확히 내가하고있는 일이지만, 코드를 깨끗하게 만들려면 일단 충분한 양의 HTML이 쌓이면 출력물을 산출하도록 출력 버퍼를 만들어야합니다. 전송할 무언가가있을 때마다 항복하는 것은 아파치 속도를 늦춘다. – Ian