2016-06-24 5 views
0

В настоящее время я получаю эту ошибку. Я смущен, потому что из того, что я могу сказать, Generator Exit просто получает вызов, когда генератор заканчивается, но у меня есть тонна других генераторов, наследующих этот класс, которые не называют эту ошибку. Правильно ли настрою генератор? или есть какой-то неявный код, который я не принимаю во внимание, который вызывает close()?Проблема с генераторомExit в Tornado

"error": "Traceback (most recent call last):\n File \"/stashboard/source/stashboard/checkers.py\", line 29, in run\n yield self.check()\nGeneratorExit\n", 

код где называется это утверждение выход:

class Checker(): 

    def __init__(self, event, frequency, params): 
     self.event = event 
     self.frequency = frequency 
     self.params = params 

    @gen.coroutine 
    def run(self): 
     """ Run check method every <frequency> seconds 
     """ 
     while True: 
      try: 
       yield self.check() 
      except GeneratorExit: 
       logging.info("EXCEPTION") 
       raise GeneratorExit 
      except: 
       data = { 
        'status': events.STATUS_ERROR, 
        'error': traceback.format_exc() 
       } 
       yield self.save(data) 
      yield gen.sleep(self.frequency) 

    @gen.coroutine 
    def check(self): 
     pass 

    @gen.coroutine 
    def save(self, data): 
     yield events.save(self.event, data) 

и это код, который наследует от него:

class PostgreChecker(Checker): 
    # checks list of Post 
    formatter = 'stashboard.formatters.PostgreFormatter' 

    def __init__(self, event, frequency, params): 
     super().__init__(event, frequency, params) 
     self.clients = [] 
     for DB in configuration["postgre"]: 
      # setup and create connections to PG servers. 
      postgreUri = queries.uri(DB["host"], DB["port"], DB["dbName"], 
            DB["userName"], DB["password"]) 
      # creates actual link to DB 
      client = queries.TornadoSession(postgreUri) 
      # starts connection 
      client.host = DB["host"] 
      self.clients.append(client) 

    @gen.coroutine 
    def check(self): 

     for client in self.clients: 
      try: 
       yield client.validate() 
       self.save({'host': client.host, 
           'status': events.STATUS_OK}) 
      except (ConnectionError, AutoReconnect, ConnectionFailure): 
       self.save({'host': client.host, 
          'status': events.STATUS_FAIL}) 
+0

Внутри '@ gen.coroutine' вы всегда должны получать вызовы под-сопрограмм. У вас есть 'self.save (...)' вместо 'yield self.save (...)' в вашем последнем методе (дважды). –

ответ

0

Торнадо никогда не называет close() на своих генераторов, но сборщик мусора (начиная с Python 3.4, я думаю). Как называется checker.run()? Используйте IOLoop.spawn_callback() для пожарных команд; это будет содержать ссылки на них и позволит им продолжать работать бесконечно.

+0

Да, он работает в цикле 'while true', как я могу использовать' spawn_callback() '? Должен ли я запустить self.check() в качестве обратного вызова? или вызовите spawn after –

+0

'IOLoop.current(). spawn_callback (f)', где 'f', вероятно, является функцией с циклом' while True', который вызывает 'checker.run()'. –

0

Особый вопрос здесь заключался в том, что мои курсоры db не были автоматически повторно подключены. Я использовал библиотеку queries, но переключился на momoko, и проблема исчезла