Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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异步API和get\u或\u insert\u异步_Python_Google App Engine_App Engine Ndb - Fatal编程技术网

Python NDB异步API和get\u或\u insert\u异步

Python NDB异步API和get\u或\u insert\u异步,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我正试图将注意力集中在异步api上,但没有取得多大成功 我在我的实验室项目中有一个相当简单的设置。我有一个这样的模型: class SearchIndex(model.Model): name = model.StringProperty(required=True) reference_list = model.KeyProperty(repeated=True) 以及一个使用get_或_insert的方法,该方法检查reference_列表是否包含键,如果没有,则添加键。实

我正试图将注意力集中在异步api上,但没有取得多大成功

我在我的实验室项目中有一个相当简单的设置。我有一个这样的模型:

class SearchIndex(model.Model):
    name = model.StringProperty(required=True)
    reference_list = model.KeyProperty(repeated=True)
以及一个使用get_或_insert的方法,该方法检查reference_列表是否包含键,如果没有,则添加键。实体下方为模型实体,列表为字符串列表[“abc”、“def”、“ghi”]

这是我想要的,但很长一段时间。如果列表的长度约为20-30倍。大约花了15-20秒

所以我开始研究异步api。但不要走得太远。现在它在数据库中不存储任何东西:

@classmethod
def store_list_in_index(cls, list, entity):
    put_queue = []
    async_queue = []

    @tasklets.tasklet
    def txn(verb, entity):
        ent = yield cls._SEARCH_INDEX_DB_MODEL.get_or_insert_async(verb, name=verb)
        if not entity.key in ent.reference_list:
            ent.reference_list.append(entity.key)
            put_queue.append(ent)
        raise tasklets.Return(ent)

    for verb in list:
        en = txn(verb, entity)

    if put_queue:
        ndb.put_multi_async(put_queue)
我真的不明白在哪里,主要是因为我不理解微线程和产量的概念。有人有什么想法或者能为我指点方向吗

编辑:

我最终得到了这个解决方案:

@classmethod
@ndb.tasklet
def get_or_insert_index_entity(cls, verb):
    ent = yield cls._SEARCH_INDEX_DB_MODEL.get_by_id_async(verb)
    if not ent:
        key = ndb.Key(cls._SEARCH_INDEX_DB_MODEL, verb)
        ent = cls._SEARCH_INDEX_DB_MODEL(key=key, name=verb)
        yield ent.put_async()

    raise ndb.Return(ent)

@classmethod
@ndb.tasklet
def txn(cls, verb, entity):
    ent = yield cls.get_or_insert_index_entity(verb)
    if not entity.key in ent.reference_list:
        ent.reference_list.append(entity.key)
        yield ent.put_async()
    raise ndb.Return(ent)

@classmethod
def store_list_in_index(cls, list, entity):
    put_queue = []
    for verb in list:
        put_queue.append(cls.txn(verb, entity))
并将@ndb.toplevel添加到我的get请求处理程序中。而且要快得多


我还发布了这个问题,并包含了一些后续问题

如果您不等待“ndb.put\u multi\u async(put\u queue)”返回结果,那么您的web处理程序可能会在实际发出请求之前完成。检查put\u multi\u async函数的返回值。这是一份未来的清单


要等待一个未来完成,可以说fut.get_result()(如果不关心返回值,可以说fut.wait())。如果你有很多未来,你可能想要未来。wait_all wait_any如

所述,如果你不等待结果从“ndb.put_multi_async(put_queue)”返回,那么你的web处理程序可能在真正开始发出请求之前就完成了。检查put\u multi\u async函数的返回值。这是一份未来的清单


要等待一个未来完成,可以说fut.get_result()(如果不关心返回值,可以说fut.wait())。如果你有一大堆的未来,你可能想要未来。等等,所有的等等,任何描述在

你是绝对正确的。但我最终使用了@ndb.toplevel,我认为它也可以做类似的事情。用我结束upp时使用的解决方案更新了这个问题。可悲的是,我是一位技术作家,他写的文档让你很难从一开始就理解这个问题。所以,如果你对如何使大脑包装更容易有什么建议,请大声说出来。我主要想说的是不同的装饰师做什么,以及他们之间的区别。还有几个例子。例如,最佳实践是何时使用tasklet以及何时使用.get\u结果。这也许不是最好的地方。找不到你的电子邮件,但如果你能给我一封(个人资料中的邮件),我有一些(我认为)好主意如何改进这一点。是的,确实,这些都是好主意,谢谢你。我在你的个人资料中看不到电子邮件地址(可能stackoverflow会隐藏它们以防止滥用?),但是如果你有更多的话要说,你可以通过lahosken@google.com . 非常感谢。可能:)我找到了你的电子邮件地址(som网络+评论的东西)。但我会把它重新发送到你的谷歌地址。你完全正确。但我最终使用了@ndb.toplevel,我认为它也可以做类似的事情。用我结束upp时使用的解决方案更新了这个问题。可悲的是,我是一位技术作家,他写的文档让你很难从一开始就理解这个问题。所以,如果你对如何使大脑包装更容易有什么建议,请大声说出来。我主要想说的是不同的装饰师做什么,以及他们之间的区别。还有几个例子。例如,最佳实践是何时使用tasklet以及何时使用.get\u结果。这也许不是最好的地方。找不到你的电子邮件,但如果你能给我一封(个人资料中的邮件),我有一些(我认为)好主意如何改进这一点。是的,确实,这些都是好主意,谢谢你。我在你的个人资料中看不到电子邮件地址(可能stackoverflow会隐藏它们以防止滥用?),但是如果你有更多的话要说,你可以通过lahosken@google.com . 非常感谢。可能:)我找到了你的电子邮件地址(som网络+评论的东西)。但我会将其重新发送到您的谷歌地址。我正在回复appengine ndb讨论列表的一些细节。我正在回复appengine ndb讨论列表的一些细节。
@classmethod
@ndb.tasklet
def get_or_insert_index_entity(cls, verb):
    ent = yield cls._SEARCH_INDEX_DB_MODEL.get_by_id_async(verb)
    if not ent:
        key = ndb.Key(cls._SEARCH_INDEX_DB_MODEL, verb)
        ent = cls._SEARCH_INDEX_DB_MODEL(key=key, name=verb)
        yield ent.put_async()

    raise ndb.Return(ent)

@classmethod
@ndb.tasklet
def txn(cls, verb, entity):
    ent = yield cls.get_or_insert_index_entity(verb)
    if not entity.key in ent.reference_list:
        ent.reference_list.append(entity.key)
        yield ent.put_async()
    raise ndb.Return(ent)

@classmethod
def store_list_in_index(cls, list, entity):
    put_queue = []
    for verb in list:
        put_queue.append(cls.txn(verb, entity))