2012-12-17 4 views
0

내가 처리하고 저장 URL 정보와 HTTP 요청이 될 때마다 생성되는 병 응용 프로그램에서 클래스를 만들었습니다.Python Bottle 애플리케이션의 클래스 인스턴스는 스레드/프로세스간에 공유됩니까?</p> <pre><code>@route('/<fullurl:path>') def page_req(fullurl=''): urlData = urlReq(request.urlparts[1], fullurl) </code></pre> <p>urlData은 인스턴스 이름이고 urlReq 클래스의 이름입니다

분명히 urlData 인스턴스에는 한 요청에서 생성 된 정보가 포함됩니다. 첫 번째 요청의주기가 끝나고 출력을 보내기 전에 다른 요청이 들어 오면 어떻게되는지 궁금 할 것입니다. 두 번째 요청이 urlData의 데이터를 변경합니까, 아니면 자체 버전의 urlData가있는 두 개의 개별 프로세스가 있을까요?

오후 내내 WSGI 프로세스/스레드 정보와 Bottle 문서를 읽었으며 여전히 명확하지 않습니다. 나는 작은 자동화 된 스크립트를 작성하여 개발 서버에서 여러 요청을 시도했지만, 끝날 때까지 초과 요청을 보류하는 것으로 보인다. 내가 충분히 분명했으면 좋겠다.

답변

1

bottle.requestLocalRequest()의 스레드로부터 안전한 인스턴스입니다. 요청 콜백 내에서 액세스하는 경우이 인스턴스는 항상 현재 요청을 참조합니다 (다중 스레드 서버에서도).

참조 http://bottlepy.org/docs/dev/api.html#bottle.request

+0

'request' 개체는 스레드로부터 안전하므로이 내용을 읽었습니다. 'urlData'는'request'의 하위 클래스가 아니라 내 자신의 클래스의 인스턴스이며 콜백의 일부로 생성됩니다. WSGI 문서에서는 여러 프로세스를 사용하는 데몬 모드에서 각 프로세스가 하위 인터프리터이므로 각 인스턴스가 안전하다고합니다. 여러 스레드를 사용하면 하나의 인터프리터 인스턴스를 사용하므로 각 스레드는 동일한 클래스 인스턴스에 액세스 할 수 있습니다. 또는 완전히 혼란 스럽거나 잘못 될 수 있습니다. –

+1

Bottle은 콜백 함수를 각 요청마다 한 번씩 호출합니다. 다른 스레드에서 동시에 호출 할 수 있습니다. 그러나'urlData'는 당신의 예제에서 지역 변수입니다. 전역 변수에 액세스하거나 변경하지 않는 한 모든 것은 스레드로부터 안전합니다. – defnull

+0

방금 ​​프로그래밍이 많이 저장되었습니다. 감사합니다. –