2011-03-08 46 views
2

我的代碼使用matplotlib這需要一個或兩個好的加載(它似乎)。問題是,當我將kill -HUP <pid>發送給Gunicorn時,下一次請求Gunicorn在請求時加載實際代碼,這需要花費一兩秒鐘的時間。Gunicorn,Django和緩慢加載代碼...?

我想不強迫用戶等待這一兩個。我一直在玩urllib2.urlopen()並強制一些實例加載代碼,但我無法保證所有工作人員都已加載代碼。

我該如何解決後端在請求時和加載代碼時的問題?我是否將有問題的緩慢加載模塊放在settings.py中?

回答

4

Gunicorn有一些非常棒的配置。當時瀏覽他們的源代碼的git克隆,並發現了一個example_config.py,它有一個「post_fork」讓我思考。稍微多了一點點後,我想出了這個解決方案。

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

凡gunicorn_conf.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足夠靈活,允許這個!

UPDATE:更新的代碼,只需在加載模塊的設置打破,有時由於道路Django的負載模塊我假設......這個新的代碼猴子補丁gunicorn在一個「安全」的時間來加載模塊...希望

更新: gunicorn 0.12.1修正了這個問題

0

這聽起來像是由於Django在某些模塊上延遲導入導致的。我要麼使用settings.py,要麼使用特定的應用程序的urls.py,以便在員工啓動時導入它們。