2012-07-13 6 views
1

매일 다시 시작되는 셀러리 Python 작업자 프로세스가 있습니다. 그들은 Python/Django 프로그램을 실행합니다.장기 실행 프로세스에서 전역 Python 변수 다시로드

프로세스 기간 동안 메모리에 유지되어야하는 특정 준 세계 값을 설정했습니다. 즉, 자주 변경되지 않는 특정 MySQL 쿼 리셋이 있으므로 프로세스가 시작 되 자마자 한 번만 평가되고 상수로 저장됩니다 (PROFILE = Profile.objects.get (user_id = 5)라는 나쁜 예).

완전히 새로운 프로그램을 실행하지 않고 셀러리 프로세스에서이 값을 재설정하려고한다고 가정 해 봅니다.

이 값은 여러 모듈에서 가져와 사용합니다. 나는 상수를 가져오고 키를 삭제/재설정하는 sys.modules에서 각각 하나씩 검토해야한다고 가정합니다. 그게 맞습니까?

이것은 매우 해킹 된 것 같습니다. 나는 보통 Memcached와 같은 외부 서비스를 사용하여 여러 프로세스간에 메모리를 조정하지만, 때로는 로컬 메모리가 NoSQL 저장소에 대한 네트워크 호출보다 바람직합니다.

답변

2

일부 코드를 보지 않고 말하기는 어렵지만 가져 오기는 변수 할당과 마찬가지로 참조를 설정합니다. 즉, 데이터가 변경되면 참조도 변경됩니다. 당신이 가져온 부모 컨텍스트의 경우이에만 작동 당연히 불구하고 (그렇지 않으면 할당은 오히려 값을 업데이트하는 것보다 참조를 변경합니다.)

을 다른 말로하면, 당신이 할 경우 :

from mypackage import mymodule 
do_something_with(mymodule.MY_CONSTANT) 

#elsewhere 
mymodule.MY_CONSTANT = 'new_value' 

을 mymodule.MY_CONSTANT에 대한 모든 참조는 새 값을 가져옵니다. 그러나 만약 당신이 이런 짓을하는 경우 :

from mypackage.mymodule import MY_CONSTANT 

# elsewhere 
mymodule.MY_CONSTANT = 'new_value' 

당신이 뭔가하지만 첫 번째 참조가 여전히 이전 값으로 가리키는에 리바운드 MY_CONSTANT을했습니다 때문에 원래의 참조, 새로운 값을받지 않습니다.

+0

빛나는, 완벽한 말이됩니다. 감사합니다 다니엘 – Ben

+0

도와 줘요 많이 줘, 고마워 !!! – Krishh