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