2011-08-22 3 views
2

Mon application django s'exécute sur apache + wsgi. L'un des modules de mon application django doit charger une bibliothèque Java via jpype et cette bibliothèque Java prend beaucoup de temps à s'initialiser en raison de sa nature d'application.module d'initialisation sur django + mod_wsgi + apache

Le problème est que, pour chaque requête http traitée par django dans Apache + wsgi setup, cette bibliothèque Java est rechargée. Cependant, cela ne se produit pas lorsque je lance ma même application dans le serveur web de développement (python manager.py runserver 8000). Dans le serveur Web de développement, il ne charge qu'une seule fois la bibliothèque Java.

Est-il possible de changer la configuration d'apache ou de mod_wsgi ou mon application django pour qu'elle ne recharge pas ma bibliothèque Java pour chaque requête http?

Merci beaucoup.

Andy

+0

Dans quelle partie de votre projet/application la bibliothèque est-elle chargée? Paramètres du projet? Dans les fichiers spécifiques à l'application? –

+0

La bibliothèque est chargée dans l'un de mes fichiers spécifiques à l'application. Ce fichier contient une méthode statique de classe pour charger la bibliothèque java si elle n'est pas déjà chargée. – Andy

+1

Le problème est que lors de l'utilisation de Django en production, un fichier spécifique à une application peut être importé plus d'une fois, donc votre appel à la bibliothèque Java sera plus d'une fois. J'ai eu les mêmes problèmes avec PyLucene avant qui initialisait la VM Java. Une bonne solution consiste à charger la bibliothèque dans votre fichier settings.py (qui ne doit être importé qu'une seule fois par thread wsgi), puis à faire référence à cela dans votre application. –

Répondre

1

Vous êtes peut-être juste de se confondre et utilisez en fait comme une mauvaise configuration Apache/mod_wsgi. Plus précisément, vous utilisez probablement le mode intégré avec Apache prefork MPM. C'est mauvais car Apache utilisera beaucoup de processus à un seul thread et donc le code doit être chargé dans chacun d'eux. C'est pourquoi vous pensez probablement qu'il se passe sur chaque demande contre le même processus, où en réalité, chaque demande touche un processus différent. Assurez-vous que vous utilisez le mode démon de mod_wsgi et que votre code est thread-safe et donc utiliser un seul processus multithread et il ne devrait pas avoir le problème.

Modifiez votre question et ajoutez vos extraits de configuration Apache/mod_wsgi à partir du fichier de configuration Apache et indiquez le MPA Apache que vous utilisez.

+0

Merci - J'ai pu voir l'application django et la librairie Java externe a été initialisée une fois dans chaque processus thread dans la configuration de prefork MPM en abaissant le nombre StartServers, et aussi dans chaque processus en mode daemon de mod_wsgi. Les deux fonctionnent bien pour moi. – Andy

Questions connexes