在Google App Engine中安排运行时间超过十分钟的任务的最佳方法是什么?

时间:2015-05-23 13:22:16

标签: python google-app-engine cron

我们说我有一个运行一个小时的脚本。它只是睡了一个小时,并在一小时结束时更改了数据存储区中的内容。

def task(keyname):
    time.sleep(3600)
    q = Item.all()
    item = q.filter("keyname = ", "%s" % keyname).get()
    item.value += 1
    item.put()

实现这一目标的最佳方式是什么?

cron文档说" cron调用的HTTP请求可以运行长达10分钟,但受到与其他HTTP请求相同的限制。"我假设这意味着超过十分钟的cron任务将会中断。

我查看了Task Queue文档,但我不想一个接一个地排队这些任务。我希望他们同时发生。

我正在考虑添加一个计数器属性并每分钟运行一次任务而不是睡觉:

def task(keyname):
    q = Item.all()
    item = q.filter("keyname = ", "%s" % keyname).get()
    if item.counter == 60:
        item.value += 1
        item.put()
    else:
        item.counter += 1
        item.put()

但是访问数据库的次数太多了。

那么,有没有人有更聪明的解决方法?

3 个答案:

答案 0 :(得分:0)

当你说你希望“这些任务”同时发生时,我不明白你的意思;你只提到了一项任务。

无论如何,任务队列是执行此操作的方法。您可以使用Task构造函数的countdown参数告诉它在3600秒内执行。

我通常更喜欢使用deferred library,它可以动态创建任务,而无需设置特定的处理程序:

from google.appengine.ext import deferred
...
deferred.defer(my_task, _countdown=3600)

答案 1 :(得分:0)

cron作业命中一个处理程序,这个处理程序启动一个任务。这个过程通常不到一秒钟。之后,只要您需要,任务就可以运行 - 如有必要,永远可以运行。这一切都取决于on the target of a task。 10分钟限制仅适用于前端(F类型)实例。

如果需要,您可以同时执行许多任务。

答案 2 :(得分:0)

@Soricidae,你正在建立一个cron任务。

  1. 为此,您需要一个调用方法任务的处理程序。
  2. 此外,您需要指定指向该处理程序的URL路由。
  3. 然后你需要在你的cron.yaml中指定一个cronjob来调用 task 方法。
  4. *。另外,我强烈建议使用任务队列来让appengine在cron任务期间解决你的加载时间问题。

    例如,在我的情况下,我有一个欢迎处理程序,通过电子邮件发送给用户,每24小时检查一次超过1天的新用户是否尚未受到欢迎......

    所以,我已经定义了以下路由(1表示cronjob,1表示taskqueue):

    RedirectRoute('/cronjob-welcome/', handlers.WelcomeCronjobHandler, name='cronjob-welcome', strict_slash=True),
    RedirectRoute('/taskqueue-welcome/', handlers.WelcomeHandler, name='taskqueue-welcome', strict_slash=True),
    

    然后,我已经定义了一个cronjob处理程序,一旦调用它作为任务队列的真实操作处理程序,请参阅:

    class WelcomeCronjobHandler(BaseHandler):
        def get(self):
            welcome_url = self.uri_for('taskqueue-welcome')
            taskqueue.add(url=welcome_url, params={
                'offset': 0
            })
    

    你可以看到这个处理程序要求welcome_url,它在路由中调用定义的处理程序 taskqueue-welcome 并执行以下操作:

    class WelcomeHandler(BaseHandler):
        """
        Core Handler for sending users welcome message
        Use with TaskQueue
        """
    
        @taskqueue_method
        def post(self):
            # ... MY CODE FOR EMAILING USERS ....
            # ... YOUR CODE SHOULD GO IN HERE ...
    

    最后,为了每24小时调用一次cronjob处理程序,在我的cron.yaml文件中我添加了以下内容,请注意 cronjob-welcome 的路由:

    - description: welcome messaging
      url: /cronjob-welcome/
      schedule: every day 13:00
    

    总结一下,我的 cron.yaml 每天13:00致电 cronjob处理程序,同时触发任务队列处理程序,调度google appengine taskqueue解决我的预定任务

    希望这有帮助。