我正在尝试在Google App Engine上开发Twitter应用程序。该应用程序基本上收集Twitter用户和他/她的粉丝及其粉丝的所有推文等。它通常每个用户每次运行收集500条推文,然后将用户的数据插入数据库。
推文收集过程必须每小时完成一次。目前,我正在使用cron作业来做这件事。但它给了很多截止日期超出的错误,即使对于一个用户来说,这也不是一个好兆头。我正在使用Python。所以我想知道我应该为此使用什么?我在网上搜索过,并且知道可以使用任务队列和cron。但我不知道该怎么做。如果有人可以帮助我,我将非常感激。还有其他我可以使用的方法/方法吗?
答案 0 :(得分:4)
要避免DeadlineExceededExceptions,请使用多个延迟Push Task Queues。使用任务队列,可以更轻松地将多个任务分解为更小的工作单元,从而防止任何单个任务超过分配给任务队列的10分钟阈值。
使用Task Queue API,应用程序可以在用户请求之外的用户请求之外执行工作。如果应用程序需要执行一些后台工作,它可以使用任务队列API将该工作组织成称为任务的小型离散单元。该应用程序将任务添加到稍后要执行的任务队列。
Deferred Task Queues是推送任务队列,它们本质上是预定的任务,具有预定的触发时间。以下是如何创建延期任务的简短示例:
import logging
from google.appengine.ext import deferred
def do_something_expensive(a, b, c=None):
logging.info("Fetching Twitter feeds!")
# Fetch the Twitter data here
# Somewhere else - Pass in parameters needed by the Twitter API
deferred.defer(do_something_expensive, "BobsTwitterParam1", "BobsTwitterParam2", c=True)
deferred.defer(do_something_expensive, "BobsFriendTwitterParam1", "BobsFriendTwitterParam2", c=True)
从Twitter用户获取数据的过程本质上是递归的,因为您为追随者的追随者等提取数据,并且此任务作为单个过程可能非常昂贵并且可能超过阈值。
任务必须在原始请求的10分钟内完成执行并发送200-299之间的HTTP响应值。此截止日期与用户请求分开,用户请求的截止日期为60秒。如果您的任务的执行接近极限,App Engine会引发DeadlineExceededError(来自模块google.appengine.runtime),您可以在截止日期过后保存您的工作或记录进度。如果任务未能执行,App Engine将根据您可以配置的条件对其进行重试。
但是,如果您将每个Twitter用户分成一个完全独立的任务,那么每个任务只运行一次,以获取单个用户的Twitter结果。这不仅效率更高,而且如果在获取用户数据之一时出现问题,则只有该任务失败而其他任务应继续执行。
换句话说,不要尝试在单个任务中获取所有数据。
或者,如果在不太可能的情况下或由于某种原因这些任务超过10分钟的阈值,请查看Backends。