Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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映射\u用于删除的异步奇怪行为_Python_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

应用程序引擎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()
    ,它将正确地获取所有实体
因此:

  • 你知道发生了什么事吗
  • 这是远程api的(删除)限制吗

  • 您需要将整个操作包装在中,或者显式调用
    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我相信你可以用几百把钥匙。