Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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 GAE/P:处理最终一致性_Python_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Python GAE/P:处理最终一致性

Python GAE/P:处理最终一致性,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,在五月应用程序中,我有以下过程: 得到一份很长的名单 为每个人创建一个实体 向每个人发送电子邮件(第2步必须在第3步开始前完成) 因为人的列表非常大,我不想把他们放在同一个实体组中 在执行步骤3时,我可以查询如下人员列表: Person.all() 由于最终的一致性,我可能会错过步骤3中的一些人。在第3步中,什么是确保我不遗漏任何人的好方法 有比这更好的解决方案吗 while Person.all().count() < N: pass for p in Person.all()

在五月应用程序中,我有以下过程:

  • 得到一份很长的名单
  • 为每个人创建一个实体
  • 向每个人发送电子邮件(第2步必须在第3步开始前完成)
  • 因为人的列表非常大,我不想把他们放在同一个实体组中

    在执行步骤3时,我可以查询如下人员列表:

    Person.all()
    
    由于最终的一致性,我可能会错过步骤3中的一些人。在第3步中,什么是确保我不遗漏任何人的好方法

    有比这更好的解决方案吗

    while Person.all().count() < N:
        pass
    for p in Person.all()
        # do whatever
    
    while Person.all().count()
    编辑:


    我想到了另一个可能的解决办法。我可以创建一个人员的链接列表。我可以存储到第一个的链接,他可以链接到第二个,等等。但是,性能似乎会很差,因为您将分别执行每个get,并且没有查询的效率。

    更新:我重新阅读了您的帖子,发现您不想将它们都放在同一个实体组中。我不知道不这样做如何保证强一致性。您可能希望重新构造数据,以便不必将它们放在同一个实体组中,而是放在多个实体组中。也许取决于一组个人实体的某些方面?(例如,他们所在的邮件列表、发送的电子邮件类型等)每个人是否只包含姓名和电子邮件地址,或者是否涉及其他属性

    :

    如果你的应用程序可能遇到更重的写用法,你可能需要考虑使用其他方法:例如,你可以把最近的帖子放在<>强> MyCache中,期限为,并显示MyCache和DATASORE中最近的帖子的组合,或者<强>你可以将它们缓存在Cookie < /强>中,在URL中放置一些状态或完全其他的状态。我们的目标是找到一个缓存解决方案,在当前用户发布到应用程序的时间段内为该用户提供数据。请记住,如果在事务中执行get、put或任何操作,您将始终看到最近写入的数据

    所以看起来你可能想调查这些可能性,尽管我不确定它们是否能很好地转化为你的应用程序所需要的

    原创帖子:使用

    来自谷歌的:

    要获得高度一致的查询结果,需要使用祖先查询,将结果限制为单个实体组。这是因为实体组是一致性和事务性的一个单元。所有数据操作都应用于整个组;在整个实体组更新之前,祖先查询不会返回其结果。如果应用程序依赖于某些查询的强一致性结果,那么在设计数据模型时可能需要考虑这一点。本页讨论构建数据以支持强一致性的最佳实践

    因此,在创建Person实体时,请为其设置父实体。我相信你甚至可以让一个特定的实体成为所有其他实体的“家长”,这应该给你很强的一致性。(尽管我还是喜欢用祖先来构建我的数据。)

    您甚至可以在该点对具有相同父级的所有实体进行查询,这很好。但这应该有助于你获得更一致的结果

    # Gives you the ancestor key
    def ancestor_key(kind, id_or_name):
        return db.Key.from_path(kind, id_or_name)
    
    # Kind is the db model your using (should be 'Person' in this case) and
    # id_or_name should be the key id or name for the parent
    new_person = Person(your_params, parent=ancestor_key('Kind', id_or_name)