2016-08-01 9 views
1

Wenn ich etwas wie folgt aus:Tornado Execution Order Spawn Callback

@tornado.gen.coroutine 
def first(x): 
    # 
    # do stuff 


    for i in I: 
     tornado.ioloop.IOLoop.current().spawn_callback(func,i) 

    tornado.ioloop.IOLoop.current().spawn_callback(func2,z) 

yield first(xxx) 

Kann ich garantiert werden, dass alle gelaicht Funktionen in der for Schleife vor dem letzten Laich von Rückruf func2 laufen wird()?

Antwort

5

Nein, in der Tat sind Sie garantiert, dass alle Funktionen hervorgebracht werden, bevor eine von ihnen zu laufen beginnt, weil first nicht yield zwischen Laich tut func und Laich func2. Sie können dies selbst überprüfen, indem Sie den Code zu testen:

from tornado import gen, ioloop 

@gen.coroutine 
def func(): 
    print('func started') 
    yield gen.moment 
    print('func done') 


@gen.coroutine 
def func2(): 
    print('func2 started') 
    yield gen.moment 
    print('func2 done') 


@gen.coroutine 
def first(): 
    for i in range(2): 
     ioloop.IOLoop.current().spawn_callback(func) 

    ioloop.IOLoop.current().spawn_callback(func2) 
    yield gen.sleep(1) 

ioloop.IOLoop.current().run_sync(first) 

Er druckt:

func started 
func started 
func2 started 
func done 
func done 
func2 done 

See, func2 beginnt, bevor die Koroutinen func vollständig ausgeführt wird.

Um das zu erreichen, was Sie wollen:

@gen.coroutine 
def first(): 
    yield [func() for i in range(2)] 
    ioloop.IOLoop.current().spawn_callback(func2) 

Diese Drucke:

func started 
func started 
func done 
func done 
func2 started 
func2 done 

Wenn Sie first wollen func2 warten zu beenden, bevor es beendet wird, dann:

@gen.coroutine 
def first(): 
    yield [func() for i in range(2)] 
    yield func2() 

Weitere Informationen zum Aufrufen von Coroutinen aus Coroutinen finden Sie unter Refactoring Tornado Coroutines.

+0

Danke, dass Sie sich die Zeit genommen haben zu schreiben, dass Jesse sehr geschätzt hat. –