Domanda

Ho un'app Pylons in cui vorrei spostare parte della logica in un processo batch separato. L'ho eseguito con l'app principale per i test, ma farà un sacco di lavoro nel database e mi piacerebbe che fosse un processo separato che verrà eseguito costantemente in background. L'app principale dei piloni invierà lavori nel database e il nuovo processo eseguirà il lavoro richiesto in ciascun lavoro.

Come posso avviare un controller come script autonomo?

Al momento ho:

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

e nel file controller, ma non parte della classe controller:

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)

Ma l'avvio di ImportServer.py dalla riga di comando comporta:

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
È stato utile?

Soluzione

Sto redattendo la mia risposta e votando l'altra risposta di Ben Bangert, poiché è quella corretta. Ho risposto e da allora ho imparato nel modo corretto (menzionato di seguito). Se vuoi davvero, controlla la cronologia di questa risposta per vedere la soluzione sbagliata (ma funzionante) che ho proposto in origine.

Altri suggerimenti

Se vuoi caricare parti di un'app Pylons, come i modelli esterni a Pylons, carica prima l'app Pylons nello 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)

Ciò caricherà l'app Pylons, che configura la maggior parte dello stato in modo da poter continuare a utilizzare i modelli SQLAlchemy e Session per lavorare con il database.

Nota che se il tuo codice utilizza i tralicci globali come request / response / etc, allora non funzionerà poiché richiedono che sia in corso una richiesta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top