Question

J'ai une application Pylons dans laquelle je voudrais déplacer une partie de la logique vers un traitement par lots séparé. Je l'ai exécuté sous l'application principale à des fins de test, mais la base de données fera beaucoup de travail et j'aimerais qu'il s'agisse d'un processus distinct qui s'exécutera en arrière-plan en permanence. L'application Pylons principale soumettra les travaux à la base de données et le nouveau processus effectuera le travail demandé pour chaque travail.

Comment lancer un contrôleur en tant que script autonome?

J'ai actuellement:

from warehouse2.controllers import importServer
importServer.runServer(60)

et dans le fichier du contrôleur, mais ne faisant pas partie de la classe du contrôleur:

def runServer(sleep_secs):
    try:
        imp = ImportserverController()
        while(True):
            imp.runImport()
            sleepFor(sleep_secs)

    except Exception, e:
        log.info("Unexpected error: %s" % sys.exc_info()[0])
        log.info(e)

Mais le démarrage de ImportServer.py sur la ligne de commande entraîne:

2008-09-25 12:31:12.687000 Could not locate a bind configured on mapper Mapper|I
mportJob|n_imports, SQL expression or this Session
Était-ce utile?

La solution

Je rédige ma réponse et je vote contre l'autre réponse de Ben Bangert, car c'est la bonne. J'ai répondu et depuis j'ai appris la bonne façon (mentionné ci-dessous). Si vous le souhaitez vraiment, consultez l’historique de cette réponse pour connaître la mauvaise solution (mais efficace) que j’avais proposée à l’origine.

Autres conseils

Si vous souhaitez charger des parties d'une application Pylons, telles que les modèles extérieurs à Pylons, chargez d'abord l'application Pylons dans le script:

from paste.deploy import appconfig
from pylons import config

from YOURPROJ.config.environment import load_environment

conf = appconfig('config:development.ini', relative_to='.')
load_environment(conf.global_conf, conf.local_conf)

Cela chargera l'application Pylons, qui configure la plupart de l'état afin que vous puissiez utiliser les modèles SQLAlchemy et Session pour utiliser la base de données.

Notez que si votre code utilise les pylônes globaux tels que demande / réponse / etc., cela ne fonctionnera pas car ils nécessitent qu'une requête soit en cours d'existence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top