Firebase firestore事务和线程-python

Firebase firestore事务和线程-python,python,multithreading,firebase,google-cloud-firestore,Python,Multithreading,Firebase,Google Cloud Firestore,我有一个python脚本,它基于以下示例: 即: transaction = db.transaction() city_ref = db.collection(u'cities').document(u'SF') @firestore.transactional def update_in_transaction(transaction, city_ref): snapshot = city_ref.get(transaction=transaction) transact

我有一个python脚本,它基于以下示例:

即:

transaction = db.transaction()
city_ref = db.collection(u'cities').document(u'SF')

@firestore.transactional
def update_in_transaction(transaction, city_ref):
    snapshot = city_ref.get(transaction=transaction)
    transaction.update(city_ref, {
        u'population': snapshot.get(u'population') + 1
    })

update_in_transaction(transaction, city_ref)
除了标记应该在事务中执行什么之外,我找不到任何关于事务装饰器具体做什么的好文档,但似乎每当我尝试从一个新线程调用时,它就会出现问题,我无法给出解释:

   //Works fine if called like this
   update_in_transaction(transaction, city_ref)

   //Does NOT work if called like this:
   threading.Thread(target=self.__my_method_to_start_the_transaction)
这是有问题的,因为它阻塞了我的UI线程,我无法呈现任何加载指示器,等等。有什么建议吗?我错过什么了吗


非常感谢

我创建了一个小代码来检查来自的示例数据可能发生了什么


这一切都如期而至。在你的代码中,我认为你有一个更复杂的工作流程,可能会遗漏一些东西。无论如何,如果您想了解更多关于decorator的详细信息,下面是decorator的代码,同时调用该方法。

谢谢您的帮助!我几乎对这一点放弃了希望,是的-回到基础有助于找到问题的根源,我的代码中基本上有一个竞争条件,这意味着在发送事务时没有设置侦听器。非常感谢。
from google.cloud import firestore
import threading

db = firestore.Client()
transaction = db.transaction()

city_ref = db.collection(u'cities').document(u'LA')

@firestore.transactional
def update_in_transaction(transaction, city_ref):
    snapshot = city_ref.get(transaction=transaction)
    transaction.update(city_ref, {
        u'population': snapshot.get(u'population') + 1
    })


x = threading.Thread(target=update_in_transaction, args=(transaction, city_ref))
x.start()