【问题标题】:Django GAE cron giving DeadlineExceededErrorDjango GAE cron 给出 DeadlineExceededError
【发布时间】:2014-08-22 06:23:12
【问题描述】:

我在 GAE 上运行 Django 1.5。我有一个 cron 工作,它会遍历数千个 url,并获取他们的“喜欢”计数并将其保存到数据库中。完成它可能需要 10 多分钟。当我在本地将它作为普通的 linux cron 运行但在 GAE 上出现此错误时失败:

Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 266, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/django-1.5/django/core/handlers/wsgi.py", line 255, in __call__
    response = self.get_response(request)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/django-1.5/django/core/handlers/base.py", line 175, in get_response
    signals.got_request_exception.send(sender=self.__class__, request=request)
DeadlineExceededError

我的设置:

app.yaml:

- url: /tasks/*
  script: myproject.wsgi.application
  login: admin

cron.yaml:

- description: update_facebook_resource
  url: /tasks/update_facebook_resource
  schedule: every day 04:05
  timezone: Europe/Berlin

views.py

def update_facebook_resource(request):
    resources = Resource.objects.filter(inactive=0).order_by('id')
    url_start = "https://graph.facebook.com/fql?q=select++total_count+from+link_stat+where+url%3D"
    url_end = "&access_token=..."

    for item in resources:
        url = item.link
        url_final = url_start+ "%22" + url + "%22" + url_end
        data = json.load(urllib2.urlopen(url_final))
        likes = data["data"][0]["total_count"]
        query = Resource.objects.get(id=item.id)
        query.facebook_likes = likes
        query.save(update_fields=['facebook_likes'])
    return http.HttpResponse('ok')

我应该更改什么以及如何更改,以便 GAE 让我完成它?我已经读过这个https://developers.google.com/appengine/articles/deadlineexceedederrors,但它并没有给我我真正需要的东西。

谢谢

【问题讨论】:

    标签: django google-app-engine


    【解决方案1】:

    这不仅仅是让GAE让你完成功能的问题。在为 App Engine 进行开发时,您确实需要以稍微不同的方式进行思考,这正是因为请求截止日期之类的事情。在您的情况下,您需要将任务分成块,并单独处理每个块。

    您没有说您是使用 django-nonrel 和 GAE 数据存储,还是使用 Cloud SQL 和标准 Django API。如果是前者,您可以使用query cursors 来跟踪您在资源中的进度。在每个块之后,您可以使用deferred tasks 触发下一个块,将光标传递给它,以便它从最后一个停止的地方开始。

    【讨论】:

      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2014-11-27
      相关资源
      最近更新 更多