Читая документацию Tornado, очень ясно, как вызвать функцию async для ответа:
class GenAsyncHandler(RequestHandler):
@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response = yield http_client.fetch("http://example.com")
do_something_with_response(response)
self.render("template.html")
Не хватает того, как вызов должен выполняться асинхронно для фоновой задачи, которая не имеет отношения к текущему запросу:
class GenAsyncHandler(RequestHandler):
@gen.coroutine
def _background_task():
pass # do lots of background stuff
@gen.coroutine
def get(self):
_dont_care = yield self._background_task()
self.render("template.html")
Этот код должен работать, за исключением того, что он выполняется синхронно, и запрос ожидает его до его завершения.
Каков правильный способ асинхронного вызова этой задачи, сразу же возвращая текущий запрос?