2015-05-12 5 views
0

Я новичок в python и торнадо. Я пробовал кое-что с сопрограммами.Нужна помощь в tornado coroutines

def doStuff(callback): 
 
    def task(): 
 
     callback("One Second Later") 
 
    Timer(1,task).start() 
 

 
@gen.coroutine 
 
def routine1():  
 
    ans = yield gen.Task(doStuff) 
 
    raise gen.Return(ans) 
 

 
if __name__ == "__main__": 
 
    print routine1()

Я пытаюсь получить результат DoStuff функции(), который я ожидал, что "One Second Позже". Но это не работает. Любая помощь будет оценена по достоинству. Спасибо

+0

Что такое «Таймер»? Могу ли я увидеть его исходный код или вы можете указать мне, откуда импортируется таймер? –

+0

Таймер вызывает переданную функцию после заданного времени (в секундах) асинхронно. его присутствует в пакете python для «threading». –

+0

Не смешивайте резьбу и торнадо, если вы действительно не знаете, что делаете. Do 'yield gen.sleep (1)' вместо: http://tornado.readthedocs.org/en/latest/gen.html#tornado.gen.sleep –

ответ

0

Что, вероятно, происходит, вы не запустили IOLoop, и не ожидаете завершения выполнения вашей сопрограммы до выхода вашего скрипта. Вероятно, вы заметите, что ваш скрипт работает в течение нескольких миллисекунд, а не приостанавливается на секунду, как и следовало ожидать. Сделайте это:

if __name__ == "__main__": 
    from tornado.ioloop import IOLoop 
    print IOLoop.instance().run_sync(routine1) 
+0

Спасибо Джесси за помощь. Но скрипты работают около секунды. Может ли это быть из-за таймера? –

+0

Ах, поскольку поток таймера не является демоном, я думаю, что процесс ждет потока таймера, прежде чем он выйдет. –

+0

Большое спасибо за вашу помощь. Не могли бы вы предложить несколько книг, чтобы я мог больше узнать о торнадо? –