在事务中使用deferred.defer

时间:2017-03-10 15:03:30

标签: google-app-engine transactions google-app-engine-python

Google应用引擎docs声明:

  

您可以将任务排入队列,作为Google Cloud Datastore的一部分   事务,这样任务只能入队 - 并保证是   入队 - 如果事务成功提交。

并给出了这个例子:

@ndb.transactional
def do_something_in_transaction():
    taskqueue.add(url='/path/to/my/worker', transactional=True)

但我不清楚使用deferred库创建的任务是否也是如此。为此:

@ndb.transactional
def do_something_in_transaction():
    deferred.defer(my_function)
如果事务成功提交,

是否只排队?

1 个答案:

答案 0 :(得分:1)

基本上deferred.defer只是taskqueue.add的包装。来自SDK google/appengine/ext/deferred/deferred.py档案:

def defer(obj, *args, **kwargs):
  ...
  transactional = kwargs.pop("_transactional", False)
  ...
  try:
    task = taskqueue.Task(payload=pickled, **taskargs)
    return task.add(queue, transactional=transactional)

因此,如果您希望延迟任务以事务方式排队,则只需要执行等效操作:

@ndb.transactional
def do_something_in_transaction():
    deferred.defer(my_function, _transactional=True)