我正在尝试使用龙卷风事件循环来并行执行一系列任务。 所以我正在创建一个事件循环并创建一个方法,由@ 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()有很多帮助。
答案 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
,你就可以了。