当产生多个gen.Task时,Tornado eventloop引发“NoneType对象不可迭代”

时间:2013-07-17 22:17:00

标签: python tornado

我正在尝试使用龙卷风事件循环来并行执行一系列任务。 所以我正在创建一个事件循环并创建一个方法,由@ gen.coroutine修饰,它生成一个gen.Task调用列表到另一个方法。

from tornado import ioloop, gen

class MyClass(object):                                           
@gen.coroutine                                               
def echo(text):                                              
    print text                                               
    return gen.Return()                                      

@gen.coroutine                                               
def send_messages(self, number):                             
    yield [gen.Task(self.echo, x) for x in xrange(number)]   
    self.loop.stop()                                         

def __init__(self):                                          
    self.loop = ioloop.IOLoop()                              
    self.loop.add_callback(self.send_messages, 3)            
    self.loop.start()                                        

MyClass()                                                        

对我来说似乎没关系但是不起作用。当我运行这个时,我得到一个“TypeError:'NoneType'对象不可迭代”在tornado / concurrent.py中出错。

知道我在这里做错了吗?


为了帮助调试,我发现将pdb放在send_messages()方法的某处并执行self._echo(“test”)。result()有很多帮助。

2 个答案:

答案 0 :(得分:1)

您需要提出Return例外。

class MyClass(object):                                           
    @gen.coroutine                                               
    def echo(text):                                              
        print text                                               
        raise gen.Return()                                      

答案 1 :(得分:1)

您的功能签名是错误的,因此会弄乱functools.partial绑定:

@gen.coroutine                                               
def echo(text):      # <----- MISSING self                                 
    print text                                               
    return gen.Return()

添加self,你就可以了。