应用程序引擎Python ndb映射\u用于删除的异步奇怪行为
我正在使用应用程序引擎Python ndb映射\u用于删除的异步奇怪行为,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,我正在使用map\u async(通过远程api)和一个非常简单的回调tasklet,它只删除传递的密钥。但是,并非总是在第一次执行时删除所有实体。在大多数情况下,我必须多次运行查询才能删除所有实体。守则: @ndb.tasklet def delete_key_tasklet(key): yield key.delete_async() class Person(ndb.Model): name1 = ndb.StringProperty() name2 = ndb.
map\u async
(通过远程api)和一个非常简单的回调tasklet,它只删除传递的密钥。但是,并非总是在第一次执行时删除所有实体。在大多数情况下,我必须多次运行查询才能删除所有实体。守则:
@ndb.tasklet
def delete_key_tasklet(key):
yield key.delete_async()
class Person(ndb.Model):
name1 = ndb.StringProperty()
name2 = ndb.StringProperty()
@classmethod
def delete_persons_async(cls, ancestor_key, name):
q = cls.query(ancestor=ancestor_key)
q = q.filter(ndb.OR(cls.name1 == name, cls.name2 == name))
return q.map_async(delete_key_tasklet, keys_only=True)
例如,如果我使用以下查询:
Person.delete_persons_async(ancestor_key, 'David').get_result()
我希望所有名为“David”的Person
实体都被删除
- 这可能不是一个最终具有一致性的问题。我已经等了几分钟,刷新了memcache好几次,看看这些实体是否最终消失了
- 如果我将tasklet更改为
,它将正确地获取所有实体yield key.get\u async()
您需要将整个操作包装在中,或者显式调用
delete\u async
返回值的结果,以确保操作完成
如果请求处理程序过早退出,则put可能永远不会发生
我不确定问题出在哪里,但为什么不使用
ndb.delete\u multi\u async
而不是这种更复杂、性能更低的方法呢?您添加了删除\u key\u tasklet的调用开销,但没有获得任何收益。是的,使用ndb.delete\u multi\u async
在我的大多数情况下都有效。问题是,我不知道需要删除多少个实体,因此为了避免内存问题(将太多的实体读取到内存),我必须在页面中读取它们,这不会给我带来更大的开销吗?不过,在我的一般情况下,我只需要删除大约10-50个实体,因此使用ndb.delete\u multi\u async
可能是可以的。您正在执行一个只包含密钥的查询,因此您必须将大量密钥加载到内存中,这才是一个问题。A我相信你可以用几百把钥匙。