2011-03-08 8 views
2

내 코드는 matplotlib을 사용합니다.로드하는 데는 2 분의 1 또는 2 분이 걸립니다 (보이는 것처럼 보입니다). 문제는 내가 Gunicorn에게 kill -HUP <pid>을 보냈을 때 Gunicorn에 대한 다음 요청이 요청 시간에 실제 코드를로드하는데 좋은 초 또는 두 시간이 소요된다는 것입니다.Gunicorn, Django 및 느린로드 코드 ...?

사용자가 두 번째 또는 두 번째를 기다리지 않도록하고 싶습니다. 나는 urllib2.urlopen()으로 웹 사이트를 치고 코드를로드하도록 일부 인스턴스를 강제 실행하고 있었지만 모든 워커가 코드를로드했다고 보장 할 수는 없습니다.

요청 시간과 시작될 때 코드를로드하는 백엔드를 어떻게 해결할 수 있습니까? 저속로드 모듈을 settings.py에 넣을 수 있습니까?

답변

4

Gunicorn은 꽤 멋진 구성을 가지고 있습니다. 그들의 근원의 git 복제품의 주위에 찾아보고 "post_fork"가 생각 나는 example_config.py를 찾아 냈다. 조금 더 소스를 파고 들자 나는이 솔루션을 생각해 냈습니다.

def post_fork(server, worker): 
    server.log.info("%s: Worker spawned" % worker.pid) 

    from gunicorn.workers.sync import SyncWorker 
    class SyncWorkerPreload(SyncWorker): 
     def run(self): 
      pass 

     def init_process(self): 
      super(SyncWorkerPreload, self).init_process() 
      from django.db.models.loading import get_apps 
      get_apps() 
      server.log.info('%s: App loaded' % self.pid) 
      super(SyncWorkerPreload, self).run() 

    worker.__class__ = SyncWorkerPreload 

희망이 힌트를 찾을 수 google'ing 사람을 도움 : gunicorn_conf.py이 기능이

% gunicorn_django -c path/to/gunicorn_conf.py path/to/settings.py 

.

거니 콧 (Gunicorn)이 이것을 허용 할만큼 충분히 유연 했다니 정말 대단합니다!

UPDATE : 업데이트 된 코드는 단순히 설정에서 모듈을 로딩하는 것은 때로는 희망 ... 때문에 내가 ...이 새로운 코드 원숭이 패치가 "안전"시간에 모듈을로드 gunicorn 가정하는 방식 장고로드 모듈로 나누기

UPDATE : gunicorn 0.12.1 수정이 문제

0

이것은 장고가 일부 모듈에서 지연된 가져 오기 때문인 것으로 들립니다. 나도 settings.py 또는 어쩌면 특정 애플 리케이션의 urls.py 그들을 가져올 때 노동자가 부츠를 가져올거야.