2013-05-31 84 views
1

開始使用@run_on_executor我有以下問題,這個小龍捲風測試:龍捲風:線程沒有在協程

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() 

點是測試只是循環,直到超時發生。調試代碼看起來好像executor-future被創建爲done(),因此甚至沒有被io_loop啓動。

我在這裏做錯了什麼?幫助解決這個問題是非常感謝

順便說一句:如果我使用@return_future裝飾像這樣的(爲其它是真正的意外是已經完成)

@return_future 
    def get_value(callback): 
     callback(10) 
創建一個普通的未來發生同樣的情況

感謝&問候 馬庫斯

回答

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()