如何将NDB数据传递给任务队列?
我想把这个实体传递给任务:
class MyData(ndb.Model):
...
text = ndb.StringProperty(indexed=False)
data = ndb.BlobKeyProperty(repeated=True)
details = ndb.KeyProperty(kind=Details)
我可以像下面这样做吗?
mydata = MyData.query()
mydata = mydata.filter(...)
mydata = mydata.order(MyData.added)
mydata = mydata.fetch(100)
for d in mydata:
taskqueue.add(url='/worker', payload=d)
那我该怎么从负载中提取数据呢?别以为 self.request.get('payload')
会有效果。要知道,我可以只传递 ndb 键,然后在任务中读取实体。但这样会需要额外的读取操作。或者,我能在 fetch(100)
时用 keys_only
吗?根据文档,keys_only
操作是免费的:
小型数据存储操作包括分配数据存储 ID 的调用或仅查询键,这些操作是免费的。
但这些算不算数据存储的读取操作呢?
2 个回答
0
d
仍然是一个 ndb 对象。要把它当作字典传递,可以试试这个方法(未经测试):
taskqueue.add(url='/worker', payload=d.to_dict())
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict
0
我会用一个叫做 keys_only
的查询来完成这个任务(就像你提到的,这样做几乎不会产生费用),然后我会更新你的任务队列,改成一次性批量调用。
mydata = MyData.query()
mydata = mydata.filter(...)
# the order shouldn't matter, unless you want to make sure that property exists.
# mydata = mydata.order(MyData.added)
mydata = mydata.fetch(100, keys_only=True)
tasks = [taskqueue.Task(url='/worker', params={'key': key.urlsafe()}) for key in mydata]
taskqueue.Queue('default').add(tasks)