如何将NDB数据传递给任务队列?

0 投票
2 回答
528 浏览
提问于 2025-04-18 08:03

我想把这个实体传递给任务:

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)

撰写回答