2009-07-12 5 views
3

"모든 것이 개체입니다"라는이 모든 아이디어를 가진 Python에서 스레드 안전성은 어디에 있습니까?정적 메서드 및 스레드 안전

나는 wsgi로 django 웹 사이트를 개발 중이다. 또한 리눅스에서도 작동 할 것이며, 효과적인 프로세스 관리를 사용한다는 것을 알고 있으므로 스레드 안전성에 대해 생각할 수 없습니다. 나는 모듈이 어떻게 로딩되는지에 대해서는 의심의 여지가 없다. 정적이거나 정적 인 함수가 있는가? 모든 정보가 도움이 될 것입니다.

답변

8

모듈의 함수는 클래스의 정적 메서드와 같습니다. 스레드 안전성 문제는 여러 스레드가 공유 데이터를 수정하거나 하나의 스레드가 다른 스레드가 읽는 동안 그러한 데이터를 수정하는 경우 발생할 수 있습니다. 데이터를 다른 모듈의 Queue.Queue를 통해 액세스 할 수있는 ONE 모듈이 소유하도록하는 것이 가장 좋습니다.하지만 불가능할 경우 잠금 및 기타보다 복잡한 동기화 프리미티브에 의존해야합니다.

이것은 공유 데이터에 대한 액세스가 모듈 함수, 정적 메서드 또는 인스턴스 메서드에서 발생하는지 여부에 관계없이 적용되며 인스턴스 변수, 클래스 또는 전역 변수와 같은 공유 데이터입니다 (범위 지정 및 스레드 안전성은 본질적으로 서로 다릅니다. 함수 로컬 데이터는 본질적으로 스레드 안전합니다. 함수가 공유 컨테이너를 통해 의도적으로 "공유"할 때까지 다른 스레드는 함수 인스턴스 내부의 데이터를 볼 수 없습니다.

threading 모듈 대신 파이썬의 표준 라이브러리에서 multiprocessing 모듈을 사용하는 경우 "스레드 안전성"에 신경 쓸 필요가 없습니다. 기본적으로 프로세스간에 데이터가 공유되지 않기 때문에 ... 당신은 그것을 바꾸기 위해 길을 떠나야합니다. mmap ped 파일을 통해 ;-).

0

파이썬의 일반적인 스레드 안전성을보다 잘 이해하려면 python documentation을 참조하십시오.

장고 자체는 1.0.3의 같은 thread safe 것 같다,하지만 코드가 당신은 다음을 확인해야합니다하지 않을 수 있습니다 ...

내 조언은 단순히 신경과하고자하는 것은하는 것입니다 귀하의 (예를 들어 'worker'MPM 대신에 apache 'prefork'를 사용하여) 다중 쓰레드 대신 다중 프로세스를 사용하는 애플리케이션.

+1

prefork MPM을 사용할 필요가 없습니다. mod_wsgi 데몬 모드를 사용할 수 있습니다. 이 경우에도 작업자 MPM을 프로세스의 수로 사용할 수 있으며 mod_wsgi 데몬 모드에서 사용하는 스레드는 별도로 제어됩니다. prefork의 사용은 mod_python이나 mod_wsgi의 임베디드 모드에서만 필요합니다. –