【问题标题】:why is my Python GAE code asynchronous?为什么我的 Python GAE 代码是异步的?
【发布时间】:2013-08-22 19:37:35
【问题描述】:

这是代码:

def create_game(user_id):
    game = classes.Games(user_id = user_id)
    game.put()

def get_game(user_id):
    game_query = classes.Games.gql('WHERE user_id = :1', user_id)

    game = False
    for item in game_query:
        game = item

    if not game:
        create_game(user_id)
        get_game(user_id)
    else:
        return game

def render_page(self):
    message = 'this is a game page<br>'.decode('utf-8')

    user = creditentials.get_user(self)
    if not user:
        self.redirect('/')
        return

    game = get_game(user.key().id())

    message += 'current game ID: '.decode('utf-8') + str(game.key().id())

    self.response.write(message)

我希望它只创建一个游戏实例,但它会创建 10 个!显然,GQL 查询是异步执行的,从get_game(user_id) 的第三个(?)实例开始,它只是跳过了game_query = classes.Games.gql('WHERE user_id = :1', user_id) 行。

我说的对吗?我该如何避免这种情况?

【问题讨论】:

  • 呃,我想你不明白异步是什么意思:这并不意味着它随机跳过代码行。这些函数究竟是从哪里调用的?
  • 您希望game 成为全球性的吗?这是本地的; create_gameget_game 的每次调用都有自己的 game 变量。 (此外,您可能希望在 not game 案例中返回一些内容。)
  • @DanielRoseman 不是随机的,只是正在进行的。添加了调用之前发布的函数的render_page()函数
  • @user2357112 不,我不需要它是全局的,是的,我希望它能够返回游戏

标签: python google-app-engine python-2.7 asynchronous gqlquery


【解决方案1】:

查询不会立即一致,因此您刚刚创建的实体不会在立即执行的查询中返回,您需要稍等片刻。

在您的情况下,您不需要查询实体 - 您只是创建了它,所以您知道它存在并且可以使用它。更改您的 create_game 函数以返回新游戏,然后使用它。

如果您希望您的 user_id 是唯一的(并且根据您的查询,这似乎是这种情况)您可以将其用作实体 ID,那么您可以通过 id 获取而不是查询,这将强烈 -一致。

查看this docs page 上的“数据一致性”部分,了解有关查询工作原理的更多详细信息。

【讨论】:

  • 谢谢 - 这是个好主意。我将分配一个名称键!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多