asynctools的缓存bug

标签:Google App Engine, Python

今天在用asynctools的CachedMultiTask时发现它的缓存key设置有问题:
self._cache_key = "%s,query=%s,limit=%s,offset=%s" % (self.__class__.__name__, str(self._query),str(limit),str(offset))
这个self._query是一个db.Query或db.GqlQuery对象,它没有实现__str__方法,因此str(self._query)拿到的是它的内存地址,而这在每次查询时都是会变化的,因此起不到缓存的效果。
另外他也没有处理cursor,这会让后续的查询出错。

研究了一下后发现,可以将db.Query对象转换成datastore.Query对象,然后再转换成pb对象。考虑到pb对象很大,还可以只取其hash值。实现如下:
self._cache_key = "DatastoreQueryTask:%s" % hash(query._get_query()._ToPb(limit, offset, limit))
不过由于用到了私有方法,显得不是那么安全。

1条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?