Je cherche quelque chose comme WSGI + Django Mode Autoreload pour la fiole.
Vous pouvez essayer d'utiliser Supervisord comme gestionnaire pour votre application UWSGI. Il a également une fonction de surveillance qui recharge automatique un processus lorsqu'un fichier ou un dossier a été "touché"/modifié.
Vous trouverez un bon tutoriel ici: Flacon + Nginx + UWSGI + Supervisord
Je suis en cours d'exécution UWSGI version 1.9.5 et l'option
uwsgi --py-autoreload 1
fonctionne très bien
Si vous configurez uwsgi
avec des arguments de commande, passez --py-autoreload=1
:
uwsgi --py-autoreload=1
Si vous utilisez un .ini
Fichier pour configurer uwsgi
et en utilisant uwsgi --ini
, ajoutez ce qui suit à votre .ini
déposer:
py-autoreload = 1
Pour l'environnement de développement, vous pouvez essayer d'utiliser le paramètre UWSGI --Python-Autoreload UWSGI. En regardant le code source, il ne peut fonctionner que dans le mode fileté (--en-threads).
La fonctionnalité de rechargement automatique du mode de développement Flask est en fait fourni par la bibliothèque Werkzeug sous-jacente. Le code correspondant est en werkzeug/serving.py
- ça vaut la peine de regarder regarder. Mais fondamentalement, l'application principale apparaît le serveur WSGI en tant que sous-processus que STATS chaque actif .py
Fichier une fois par seconde, à la recherche de modifications. Si elle en voit, le sous-processus sortira et le processus parent le démarre à nouveau - en effet rechargeant les lèvres.
Il n'y a aucune raison que vous ne pouvez pas implémenter une technique similaire à la couche d'UWSGI. Si vous ne voulez pas utiliser une boucle de statistique, vous pouvez essayer d'utiliser des commandes de surveillance de fichiers OS sous-jacentes. Apparemment (selon le code de Werkzezug), Pyinotify est buggy, mais peut-être WatchDog fonctionne? Essayez quelques choses et voyez ce qui se passe.
Edit:
En réponse au commentaire, je pense que cela serait assez facile à réapparaître. Construire sur l'exemple fourni de votre lien, ainsi que le code de werkzeug/serving.py
:
""" NOTE: _iter_module_files() and check_for_modifications() are both
copied from Werkzeug code. Include appropriate attribution if
actually used in a project. """
import uwsgi
from uwsgidecorators import timer
import sys
import os
def _iter_module_files():
for module in sys.modules.values():
filename = getattr(module, '__file__', None)
if filename:
old = None
while not os.path.isfile(filename):
old = filename
filename = os.path.dirname(filename)
if filename == old:
break
else:
if filename[-4:] in ('.pyc', '.pyo'):
filename = filename[:-1]
yield filename
@timer(3)
def check_for_modifications():
# Function-static variable... you could make this global, or whatever
mtimes = check_for_modifications.mtimes
for filename in _iter_module_files():
try:
mtime = os.stat(filename).st_mtime
except OSError:
continue
old_time = mtimes.get(filename)
if old_time is None:
mtimes[filename] = mtime
continue
Elif mtime > old_time:
uwsgi.reload()
return
check_for_modifications.mtimes = {} # init static
Il n'est pas testé, mais devrait travailler.