1

플라스크, 파이썬, sqlalchemy 및 postgresql에서 웹 응용 프로그램을 개발 중입니다. 내 질문은 여기에이 응용 프로그램에서 동시 처리에 관한 것입니다. 나는 데이터베이스에 사용자를 추가하는 예를 살펴python 기반 웹 응용 프로그램의 동시 처리

: 나는 응용 프로그램을 작성하는 방법

. 양식을 게시하고보기가 호출됩니다. 나는 모든 폼 데이터를 처리 한 다음 sqlalchemy 코드를 사용하여 데이터베이스에 사용자를 삽입하고 성공적인 실행을 반환하는 add_user (* arg)를 호출하고 뷰에서 응답을 반환합니다.

나는 가정 무엇 :

좋아 지금 나는 (나는 아직 결정하지 않은) 내 웹 서버가 스레드 또는 두 명의 사용자가 동시에 가입하실려고하고 처리 할 경우 프로세스를 생성합니다 하나 가정 모든 동시 요구 사항.

  1. 여기서 스레드 코드를 작성해야합니까? 쓰레 디드 코드에 의해 나는 쓰기 전에 락을 획득하고 쓰기 릴리스 후에 그것을 의미한다.
  2. 저는 웹 개발과 멀티 스레딩/멀티 프로세싱 프로그래밍에 익숙하지 않고 동시성을 잘 처리 할 수있는 웹 애플리케이션을 작성하는 방법에 대한 지침을 원합니다.
  3. 처음부터 동시 처리 처리를 작성하는 것이 옳았거나 많은 수의 동시 사용자가 webapp를 사용하고있을 때 이러한 생각이 필요합니다. 나중에 수행해야하는 경우에도 그것에 대한 몇 가지 지침을 원합니다.

기본적으로 웹 응용 프로그램 개발의 동시성 부분에 대해서는 잘 모릅니다. 당신이 내가 더 많이 배울 수있는 곳에서 자원을 가리킬 수 있다면 정말 도움이 될 것입니다.

답변

5

Flask는 별도의 스레드 또는 별도의 프로세스에서 각 요청을 실행합니다. 스폰 할 스레드 및 프로세스 수는 WSGI 서버 (예 : mod_wsgi가있는 Apache)에 의해 결정됩니다.

SQLAlchemy ScopedSessions를 사용하는 경우 세션은 스레드로부터 완벽하게 안전합니다. 스레드를 통해 ORM 제어 객체를 공유해서는 안됩니다 (대다수의 경우 객체가 요청보다 오래 살아 가게하지 않으므로 일반적으로 걱정할 필요가 없습니다).

즉, 데이터베이스 또는 쿠키 이외의 요청간에 상태를 공유하지 않으려는 경우 동시성 문제에 대해 걱정할 필요가 없습니다. 데이터베이스에 쓰기 위해 잠금을 작성할 필요가 없습니다.

대부분의 경우 수행 할 필요가없는 자신의 수명이 긴 객체를 응용 프로그램에서 생성하고 해당 객체가 요청 처리 코드로 상태를 전달하거나 공유하는 경우 동기화를 피하기 위해 적절한 예방 조치를 취해야합니다 문제 (경쟁 조건, 교착 상태, 스레드로부터 안전하지 않은 라이브러리 사용 등)

+0

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading –

+0

에서 설명하는 mod_wsgi의 동작은 @ jd 요청간에 상태를 공유하면 무엇을 의미합니까? 나는 현재 사용자의 sqlalchemy 객체를 사용자 세션에 유지하고 다음 요청시 현재 sqlalchemy 세션과 다시 병합합니다. 그것은 국가 공유인가? – codecool

+0

SQLAlchemy 개체 *를 세션에 어떻게 보관합니까? 어떤 종류의 세션을 말하는거야? 서명 된 쿠키? 세션이 서명 된 쿠키이고 데이터베이스 개체를 참조해야하는 경우 필요에 따라 개체 ID를 저장해야합니다. 개체는 DB에서 검색됩니다. –

관련 문제