【问题标题】:How to schedule a task using Google Task Queues API?如何使用 Google 任务队列 API 安排任务?
【发布时间】:2013-12-30 11:06:26
【问题描述】:

我想安排一个任务(即一段代码)在以后执行,其中执行的时间和日期以及其他参数作为任务负载传入。

所以我们有一个基于 Python (Django) 的 Appengine 应用程序,其中:

任务在 tasks.py

中定义
@csrf_exempt
def task_myfunction(request):
    if request.method == 'POST':
      # Read POST parameters
      # Perform task
    return HttpResponse("Success")

负载被添加到 views.py 中的队列中,负载被 POST 到提供的 url,它映射到上面定义的函数。

from google.appengine.api import taskqueue

# ..Somewhere inside a view..
taskqueue.add(queue_name='myqueue', url='/task/myfunction', params={
    # Specify parameters
    })

有没有办法,我可以指定执行的确切时间(带时区)以及有效负载数据,以便自动从队列中提取任务并在那个时刻执行。

【问题讨论】:

    标签: python django google-app-engine


    【解决方案1】:

    您可以计算所需时间,然后在添加任务时为其设置countdowneta

    倒计时:

    执行此任务之前等待的最短时间,以秒为单位。默认值 为零。如果您指定了 eta,请不要指定倒计时。

    埃塔:

    任务执行的最早时间,以秒为单位。 它是一个 datetime.datetime,指定绝对 ETA 或 None;这可能是时区感知或时区天真。如果没有,则默认为现在。距离当前日期必须少于 30 天。

    https://developers.google.com/appengine/docs/python/taskqueue/tasks

    正如您在上面的页面中看到的,似乎没有一种方法可以完全按照您的要求去做:时区和特定时间。我认为你必须进行这些计算。

    【讨论】:

    • “最早时间”是什么意思? eta之后可以执行任务吗?此外,它有助于知道 eta 可以指定为推送队列的 python datetime.datetime 对象。不错的答案!谢谢。我会改写一下以添加更多细节和一些示例代码。
    • 表示在该时间之前不会执行,但会在该时间之后的某个时间执行。不能保证它会在到达 ETA 的确切时刻执行。示例代码仅与截止日期的计算有关,因为它只是您传递给任务创建者的参数
    【解决方案2】:

    您正在寻找预计到达时间。顺便说一句,附带一些代码并解释如何在未来设置任务

    taskqueue.add(
                queue_name = "playercommands",
                url="/playercommands/next/",
                method='POST',
                eta=datetime.datetime.now() + datetime.timedelta(0, player.track_duration),
    
    
                headers={"X-AppEngine-FailFast":"true"} # for now
            )
    

    【讨论】:

      【解决方案3】:

      您可以使用 python-dateutil 获得不区分时区的时间戳(如 unix 时间戳)

      然后您可以使用 appengine 后端并使用该时区不敏感的时间戳来安排您的任务。 https://developers.google.com/appengine/docs/python/backends/

      【讨论】:

        【解决方案4】:

        Google 已经更新了这部分 api(see here 抱歉,链接是 PHP 的)。您现在可以使用包含以下选项的 PushTask 发送第三个参数:

        1. “方法”:字符串“POST”、“GET”、“HEAD”、“PUT”、“DELETE”之一。默认值:“POST”。
        2. 'name':字符串任务的名称。默认为 '' 表示服务将生成唯一的任务名称。
        3. 'delay_seconds': float 执行任务前等待的最短时间。默认值:零。
        4. 'header': string 任务执行时要发送的附加标头。

        【讨论】: