首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django GAE cron给DeadlineExceededError

Django GAE cron给DeadlineExceededError
EN

Stack Overflow用户
提问于 2014-08-22 06:23:12
回答 1查看 187关注 0票数 0

我在GAE上运行Django 1.5。我有一个cron作业,它可以遍历数千个urls,并获取它们的“喜欢”计数,并将其保存到DB中。它可以轻松超过10分钟完成它。当我作为一个普通的linux cron在本地运行它时,它可以工作,但是在GAE上这个错误失败了:

代码语言:javascript
复制
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:

代码语言:javascript
复制
- url: /tasks/*
  script: myproject.wsgi.application
  login: admin

cron.yaml:

代码语言:javascript
复制
- description: update_facebook_resource
  url: /tasks/update_facebook_resource
  schedule: every day 04:05
  timezone: Europe/Berlin

views.py

代码语言:javascript
复制
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,但它并没有给我真正需要的东西。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-22 08:06:11

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

对于GAE数据存储是否使用django-nonrel,或者是否使用Cloud以及标准Django API,您都不会说。如果是前者,可以使用查询游标通过参考资料跟踪进度。在每个块之后,您可以使用延迟任务来触发下一个块,将光标传递给它,这样它就可以选择最后一个停止的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25440763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档