문제

편집 : 토네이도와 같은 단일 스레드 웹 프레임 워크에서 글로벌 변수가 안전한지 묻습니다.

MongoEngine ORM을 사용하는 IM은 글로벌 변수에서 데이터베이스 연결을 얻습니다.

_get_db() # gets the db connection

IM은 또한 단일 스레드 파이썬 웹 프레임 워크 인 토네이도를 사용합니다. 한 가지 특별한 관점에서, 나는 데이터베이스 연결을 가져 와야하고 dereference a DBRef 개체 [외국 키와 유사] :

# dereference a DBRef
_get_db().dereference(some_db_ref)

연결이 반환 된 이후 _get_db 글로벌 VAR, 충돌 가능성이 있고 잘못된 값이 잘못된 스레드로 반환 될 수 있습니까?

도움이 되었습니까?

해결책

MongoEngine이 Pymongo를 감싸고 있다고 가정하면 (그리고 나는 그것을 믿습니다), 당신은 괜찮을 것입니다. Pymongo는 완전히 스레드 안전합니다.

다른 팁

파이썬 객체와 상호 작용할 때 스레드는 항상 길을 유지해야합니다. 변수를 보유하는 네임 스페이스는 파이썬 객체입니다 (프레임 버젝트 또는 dict, 어떤 종류의 변수에 따라) 여러 스레드에서 변수를 얻거나 설정하는 것이 항상 안전합니다. 쓰레기 데이터를 얻지 못할 것입니다.

그러나 일반적인 레이스 조건은 어떤 객체를 얻는 지 또는 할당 할 때 어떤 객체를 교체하는지에 따라 적용됩니다. 같은 진술 x += 1 ~이다 ~ 아니다 스레드-안전, 다른 스레드가 Get과 매장 사이에 실행될 수 있으므로 값을 변경합니다. x, 그런 다음 덮어 쓸 것입니다.

아니요,하지만 자물쇠는 파이썬에서 사용하기가 매우 간단합니다. 시도 : 마지막으로 : 패턴을 사용하여 글로벌 변수를 수정 한 후 잠금이 해제되도록하십시오.

글로벌에 대한 다른 변수보다 스레드를 안전하게 만드는 글로벌에 대한 것은 없습니다. 다른 스레드에서 실행될 때 작업이 실패하거나 잘못된 결과를 반환 할 수 있는지 여부에 관계없이 모범 사례는해야합니다. 스레드간에 공유되는 데이터를 보호합니다.

내가 당신을 올바르게 읽고 있다면, 당신은 단일 스레드 환경에서 변수가 안전한지 묻습니다. 이 경우 데이터가있는 경우 ~ 아니다 동시 프로세스간에 공유되는 변수는 안전합니다 (결국 방해 할 수있는 다른 실행은 없습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top