2013-06-18 25 views
5

W projekcie, w którym pracuję, muszę objąć usługę Tornado z Behave, dlatego chcę uruchomić instancję mojej usługi tornado przed uruchomieniem każdego scenariusza.Jak uruchomić pętlę IO Tornado podczas konfigurowania środowiska Behave

naiwnie próbuje uruchomić pętlę jako część zanim wszystko wydaje się zablokować 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() 

więc to chyba nie to, czego potrzebuję.

Odpowiedz

3

Twoja IOLoop działa w głównym wątku, więc jest blokowana. Możesz to zrobić w oddzielnym wątku lub procesie.

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

Kiedy próbuję uruchomić to na Windows, otrzymuję następujący wyjątek: 'pickle.PicklingError: Nie można marynowane . Nie znalazł jak __main __ run_server' –

+0

brzmi jak twój' run_server' funkcja nie jest dostępna. szybką rzeczą do sprawdzenia jest to, czy rzeczywiście można zaimportować 'run_server'? to znaczy, jeśli jest to lambda lub funkcja wewnętrzna do 'before_all', to nie zadziała. – Xuan

+0

'run_server' jest zdefiniowany tak, jak jest w próbce twojego kodu; znajduje się w tym samym pliku, tuż przed zdefiniowaniem 'before_all'. –

Powiązane problemy