这个龙卷风测试有以下问题:
class SimpleIOLoopTests(tornado.testing.AsyncTestCase):
def setUp(self):
super(SimpleIOLoopTests, self).setUp()
def test_executor_future(self):
self.executor = ThreadPoolExecutor(2)
@run_on_executor
def wait_and_return_a_value():
time.sleep(2)
return 20
@coroutine
def async_compare(callback):
val = yield wait_and_return_a_value()
assert_that(val, equal_to(20))
callback()
async_compare(self.stop)
self.wait()
关键是测试只是循环直到发生超时。调试代码看起来好像执行者 - 未来被创建为done(),因此,甚至没有由io_loop启动。
我在这里做错了什么?非常感谢帮助解决这个问题
顺便说一下:如果我使用像这样的@return_future装饰器来创建一个微不足道的未来会发生同样的事情(因为它已经意外地完成了)
@return_future
def get_value(callback):
callback(10)
谢谢&问候 马库斯
答案 0 :(得分:2)
问题是执行者必须“生活”在定义了io_loop和执行器的类中(当你检查@run_on_executor装饰器时可以看到这一点。)
def test_executor_future(self):
class Executor():
def __init__(self, io_loop=None):
self.io_loop = io_loop or IOLoop.instance()
self.executor = ThreadPoolExecutor(2)
@tornado.concurrent.run_on_executor
def wait_and_return_a_value(self):
return 20
def destroy(self):
self.executor.shutdown(1)
@tornado.gen.coroutine
def async_compare(callback):
executor = Executor()
val = yield executor.wait_and_return_a_value()
assert_that(val, equal_to(20))
executor.destroy()
callback()
async_compare(self.stop)
self.wait()