Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将NDB数据传递到任务队列?_Python_Google App Engine_App Engine Ndb_Task Queue_Payload - Fatal编程技术网

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())