2013-06-18 6 views
5

In un progetto in cui lavoro Devo coprire un servizio Tornado con Behave, quindi voglio avviare un'istanza del mio servizio tornado prima di eseguire ogni scenario.Come eseguire Tornado IO Loop durante l'installazione dell'ambiente Behave

Ingenuamente il tentativo di eseguire il ciclo come parte prima di tutto sembra bloccare l'excecution:

from tornado import ioloop 
from tornadoadapter.applications import APPLICATION 


def before_all(context): 
    print "Service running on port 8000" 
    APPLICATION.listen(8000) 
    ioloop.IOLoop.instance().start() 

Quindi non è probabilmente quello che mi serve.

risposta

3

IOLoop è in esecuzione nel thread principale, quindi si sta bloccando. Potresti farlo in un thread o processo separato.

from multiprocessing import Process 

from tornado import ioloop 
from tornadoadapter.applications import APPLICATION 


def run_server(): 
    print "Service running on port 8000" 
    APPLICATION.listen(8000) 
    ioloop.IOLoop.instance().start() 


def before_all(context): 
    context.server_thread = Process(target=run_server) 
    context.server_thread.deamon = True 
    context.server_thread.start() 
+0

Quando provo a fare funzionare questo su Windows, ottengo la seguente eccezione: 'pickle.PicklingError: Non può salamoia :. Non è trovato __ come __main run_server' –

+0

suona come il vostro' La funzione run_server' non è selezionabile. cosa rapida da controllare è se puoi davvero importare 'run_server'? cioè se è una lambda o una funzione interna a 'before_all', non funzionerà. – Xuan

+0

'run_server' è definito proprio come nel tuo esempio di codice; si trova nello stesso file, proprio prima che 'before_all' sia definito. –

Problemi correlati