【问题标题】:Getting task by name from taskqueue从任务队列中按名称获取任务
【发布时间】:2014-03-24 22:49:28
【问题描述】:

如何通过名称获取任务?

from google.appengine.api import taskqueue
taskqueue.add(name='foobar', url='/some-handler', params={'foo': 'bar'}

task_queue = taskqueue.Queue('default')
task_queue.delete_tasks_by_name('foobar') # would work

# looking for a method like this:
foobar_task = task_queue.get_task_by_name('foobar')

应该可以使用 REST API (https://developers.google.com/appengine/docs/python/taskqueue/rest/tasks/get)。但我更喜欢task_queue.get_task_by_name('foobar') 之类的东西。有任何想法吗?我错过了什么吗?

【问题讨论】:

    标签: python google-app-engine task-queue


    【解决方案1】:

    无法保证具有此名称的任务存在 - 它可能已经执行。即使你设法get 一个任务,它也可能在你试图用它做某事时被执行。因此,当您尝试将其放回原处时,您不知道是第一次添加还是第二次添加。

    由于这种不确定性,我看不到任何通过名称获取任务可能有用的用例。

    编辑:

    您可以为任务命名,以确保特定任务只执行一次。当您将具有名称的任务添加到队列中时,App Engine 将检查具有该名称的任务是否已存在。如果是,则后续尝试将失败。

    例如,您可以运行多个实例,并且每个实例可能需要在数据存储区中插入一个实体。您的第一个选择是检查数据存储中是否已存在实体。这是一个相对较慢的操作,当您收到响应(实体不存在)并决定插入它时,另一个实例可能已经插入了它。所以你最终会得到两个实体而不是一个。

    您的第二个选择是使用任务。实例不是直接将新实体插入数据存储区,而是创建一个任务来插入它,并为该任务命名。如果另一个实例尝试添加同名任务,它将简单地覆盖现有任务。因此,您可以保证一个实体只会被插入一次。

    【讨论】:

    • 好点。一个简单的task_queue.task_exists('foobar') 怎么样?
    • 同样的故事。当你得到“它确实存在”的回应时,它可能不再存在了。就像薛定谔的猫一样。
    • 嗯。我看不出在请求任务时询问任务是否存在有什么问题?
    • 因为响应没有意义!您问,响应会在 50 毫秒后到达(例如)。但是有可能在响应“它存在”发送给您后 2 毫秒执行了任务。因此,当“它存在”的响应到达您的面前时,该任务已经不存在了。
    • 如果有重试,任务可能存在相当长的时间。
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多