![](/img/trans.png)
[英]In a no-coroutine function, how do you get a return value from coroutine function of Tornado TCP?
[英]In Tornado, How to 'decorate' a coroutine GET function
我想裝飾GET協程方法,該方法確定是否需要從緩存中讀取數據並將數據設置為緩存。 但我不知道如何包裝一個協程。 我現在就是這樣做的:
def cache_it(f):
@functools.wraps(f)
@coroutine
def wrapper(self, *args, **kwargs):
key = self.get_cache_key()
result = cache.get(key)
if not result:
yield f(self, *args, **kwargs)
if self._result_buffer:
cache.set(key, self._result_buffer)
else:
self._result_buffer = result
class BaseHandler(RequestHandler):
def __init__(self, *args, **kwargs):
super(BaseHandler, self).__init__(*args, **kwargs)
self._result_buffer = []
def write(self, chunk):
self._result_buffer.append(chunk)
def flush(self, include_footers=False, callback=None):
self._flush_result_buffer()
super(BaseHandler, self).flush(include_footers)
def finish(self, chunk=None):
if chunk is not None:
self.write(chunk)
self._flush_result_buffer()
super(BaseHandler, self).finish()
def _flush_result_buffer(self):
for r in self._result_buffer:
super(BaseHandler, self).write(r)
self._result_buffer = []
class IndexHandler(RequestHandler):
@cache_it
@coroutine
def get(self):
...
self.write({'data': data})
但它不起作用。 請讓我知道怎么做以及我錯了。
首先是Af。 coroutine應該修復(只需添加返回):
def cache_it(f):
@functools.wraps(f)
@coroutine
def wrapper(self, *args, **kwargs):
key = self.get_cache_key()
result = cache.get(key)
if not result:
yield f(self, *args, **kwargs)
if self._result_buffer:
cache.set(key, self._result_buffer)
else:
self._result_buffer = result
return wrapper
這里也應該修復:
class IndexHandler(BaseHandler):
現在您可以緩存結果緩沖區(注意:它的列表)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.