Python 如何将NDB数据传递到任务队列?
以下是我要传递给任务的实体:Python 如何将NDB数据传递到任务队列?,python,google-app-engine,app-engine-ndb,task-queue,payload,Python,Google App Engine,App Engine Ndb,Task Queue,Payload,以下是我要传递给任务的实体: 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(...) m
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)
时,我可以只使用键吗<代码>仅按键
根据以下规定,操作是免费的:
小型数据存储操作包括分配数据存储ID或
仅键查询,这些操作是免费的
但它们是否算作数据存储读取操作?
d
仍然是ndb对象。要将其作为字典传递,请尝试以下方法(未测试):
我只会使用
keys\u
查询(如您所述,这应该不会产生什么费用),我会更新您的taskqueue以添加一个批处理调用
mydata=mydata.query()
mydata=mydata.filter(…)
#顺序应该无关紧要,除非您想确保该属性存在。
#mydata=mydata.order(mydata.added)
mydata=mydata.fetch(100,仅键=True)
tasks=[taskqueue.Task(url='/worker',params={'key':key.urlsafe()})用于mydata中的键]
taskqueue.Queue('default')。添加(任务)
这将不起作用,因为详细信息
是一个ndb.KeyProperty,如果不做一些额外的工作,它是不可JSON编码的。我将重写以指定来处理KeyProperty,并确保应用.urlsafe()
将它们转换为字符串。那么,您以后获取这些实体就不会有问题了。谢谢!单批调用的优点是什么?我计划为每个任务使用唯一的名称(因此,我不会重复处理相同的错误),如果有具有重复名称的任务,批处理调用会发生什么情况?请您帮助理解如何提取有效负载self.request.get('payload')
为空。将payload
更新为params
——与现在使用self.request.get('key')的方式相同。描述添加已存在的任务时发生的情况。如果您担心每个项目都有重复的任务,我会一次添加一个,然后捕获(taskqueue.taskalreadyexisterror,taskqueue.tombstonedtaskeror)
啊,是的,我知道如何使用参数
,但对有效负载特别感兴趣
taskqueue.add(url='/worker', payload=d.to_dict())