2

我正在尝试使用龙卷风事件循环并行执行一系列任务。因此,我正在创建一个事件循环并创建一个由@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()                                                        

对我来说似乎没问题,但不起作用。当我运行它时,我在 tornado/concurrent.py 中收到“TypeError:'NoneType' 对象不可迭代”错误。

知道我在这里做错了什么吗?


为了帮助调试,我发现在 send_messages() 方法中的某处放置一个 pdb 并执行 self._echo("test").result() 有很大帮助。

4

2 回答 2

1

您的函数签名错误,因此破坏了functools.partial绑定:

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

添加self,你就可以开始了。

于 2013-07-17T22:55:40.077 回答
1

您需要引发Return异常。

class MyClass(object):                                           
    @gen.coroutine                                               
    def echo(text):                                              
        print text                                               
        raise gen.Return()                                      
于 2013-07-17T22:50:03.800 回答