2009-07-12 18 views
9

Tengo una gran matriz, que me gustaría cargar en la memoria una sola vez cuando django se inicia y luego tratarla como una variable global de solo lectura. ¿Cuál es el mejor lugar para poner el código para la inicialización de esa matriz?Inicialización de Django

Si lo pongo en settings.py, se reinicializará cada vez que se importe el módulo de configuración, ¿correcto?

Respuesta

9

settings.py es el lugar correcto para eso. Settings.py es, como cualquier otro módulo, cargado una vez. Todavía existe el problema del hecho de que un módulo debe importarse una vez para cada proceso, por lo que un estilo de reaprovisionamiento del servidor web (como apache) lo volverá a cargar una vez para cada instancia en cuestión. Para mod_python esto será una vez por proceso. para mod_wsgi, es probable que sea solo una vez, a menos que tengas que reiniciar.

tl; los módulos dr se importan una sola vez, incluso si se utilizan varias instrucciones de importación. ponerlo en settings.py

+2

Para mod_wsgi, será una vez por proceso para esa instancia de Django también. La cantidad de procesos que pueden ser dictados depende de si está utilizando el modo incrustado o el modo daemon y, por lo tanto, cuántos procesos está ejecutando su instancia de Django. Para obtener más información sobre los diferentes modos de funcionamiento de mod_wsgi, consulte "http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading". –

+0

Poner la inicialización en settings.py a menudo causa problemas de importación circular. He luchado con esto muchas veces, y advierto a cualquiera que haga esto a la mente sobre las importaciones circulares. –

15

settings.py es para la configuración de Django; está bien poner su propia configuración allí, pero usarla para estructuras de datos no configurables arbitrarias no es una buena práctica.

Simplemente colóquelo en el módulo al que pertenece lógicamente, y se ejecutará una sola vez por instancia. Si desea garantizar que el módulo se carga en el inicio y no en el primer uso más adelante, importe ese módulo desde su nivel superior __init__.py para forzar que se cargue inmediatamente.

+5

Esta debería ser la respuesta aceptada –

+0

Pero, ¿qué ocurre si ese código de inicialización __init__.py depende de algunas configuraciones? –