这是我想传递给任务的实体:
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密钥并读取任务中的实体。但它需要额外的读取操作。或者,我可以在keys_only
时以某种方式使用fetch(100)
吗?根据{{3}}
keys_only
次操作是免费的
小型数据存储区操作包括分配数据存储区ID的调用 仅密钥查询,这些操作是免费的。
但它们是否被视为数据存储区读取操作?
答案 0 :(得分:0)
d
仍然是一个ndb对象。要将其作为字典传递,请尝试此(未经测试):
taskqueue.add(url='/worker', payload=d.to_dict())
https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict
答案 1 :(得分: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)