普通异步和事务异步不能一起工作

时间:2015-04-04 09:17:55

标签: python google-app-engine asynchronous google-cloud-datastore

我的代码得到了一些奇怪的结果。我第一次运行代码时,只有来自期货的异步函数被保存到数据存储区,但没有任何事务是。另一方面,跟踪显示交易已提交。当我运行期货为空的相同代码时,交易将存储在数据存储区中。我在这里做错了什么?

伪代码

def check_users():
  def callback(user,account):
    return ndb.put_multi_async([user,account])
  transactions = []
  futures = []
  users = Users.query().fetch(100)
  for user in users:
    if user.active:
      account = Account.query(parent=user.key).order(-Account.date).get()
      account.active = True
      user.has_account = True
      transactions.append(ndb.transanction_async(lambda:callback(user,account),xg=true))
      continue
    user.count += 1
    futures.append(user.put_async())

  for transanction in transactions:
    futures = trasanction.get_result()
    for future in futures:
      future.check_result()

  for future in futures:
    future.check_result()

trace list

已更新 第二个Does ndb.toplevel break transactions?,事务创建一个与另一个异步方法冲突的新上下文。我想知道我的代码是否发生了同样的问题。这就是问题的答案:

  

我发现问题是两者都创造了新的背景。 transactional创建一个上下文,并确保在其中发生的所有写入都是非冲突的。 toplevel创建一个上下文,并确保解决在其中创建的所有未来。

0 个答案:

没有答案