如何使用Google Task Queues API安排任务?

时间:2013-12-30 11:06:27

标签: python django google-app-engine

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

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

任务在 tasks.py

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

Payload被添加到 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
    })

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

4 个答案:

答案 0 :(得分:5)

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

倒计时:

  

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

ETA:

  

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

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

正如您在上面的页面中看到的那样,似乎没有办法完全按照您的需要进行操作:时区和特定时间。我想你必须做那些计算。

答案 1 :(得分:1)

您正在寻找ETA。通过一些代码来解释如何在未来设置任务

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
        )

答案 2 :(得分:0)

您可以使用python-dateutil

获取时区不敏感的时间戳(如unix时间戳)

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

答案 3 :(得分:0)

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

  1. 'method':string'POST','GET','HEAD','PUT','DELETE'之一。默认值:'POST'。
  2. 'name':string任务的名称。默认为“”表示服务将生成唯一的任务名称。
  3. 'delay_seconds':float执行任务之前等待的最短时间。默认值:零。
  4. 'header':string任务执行时要发送的其他标题。