2016-06-24 5 views
0

私は現在このエラーが発生しています。 Generator Exitはジェネレータが終了するたびに呼び出されるため、私は混乱しています。しかし、このクラスを継承しているこのジェネレータは、このエラーを呼び出さない大量のジェネレータがあります。ジェネレータを正しく設定していますか?または私はclose()を呼び出していることを考慮していないいくつかの暗黙的なコードがありますか?GeneratorExit issue in Tornado

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

このyield文が呼び出されるコード:

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'の中では、常にサブコルーチン呼び出しを行う必要があります。あなたは最後のメソッドで 'yield self.save(...)'の代わりに 'self.save(...)'を使います(2回)。 –

答えて

0

トルネードは決してあなたの発電機のclose()を呼び出していませんが、ガベージコレクタは(私は思うには、Python 3.4で始まります)。 checker.run()はどのように呼び出されますか?火災と忘れのコルーチンにはIOLoop.spawn_callback()を使用してください。これはそれらの参照を保持し、無期限に実行を続けることができます。

+0

これは 'while true'ループで動作します。どうすれば' spawn_callback() 'を使用できますか?私はそれのコールバックとしてself.check()を実行する必要がありますか?後で –

+0

'IOLoop.current()。spawn_callback(f)'と呼びます。 'f'はおそらくchecker.run()を呼び出す' while True'ループを持つ関数です。 –

0

ここでの特定の問題は、DBカーソルが自動的に再接続されなかったことです。 queriesライブラリを使用していましたが、momokoに切り替えました。問題はなくなった