具有任务队列的AppEngine超时

时间:2013-11-14 15:41:02

标签: python google-app-engine

我正在尝试通过任务队列在AppEngine中执行任务,但我似乎仍然面临60秒超时。我不确定我做错了什么,因为我认为限制应该是宣传的10分钟。

我打电话给urlfetch.fetch()似乎是罪魁祸首。我的电话是:

urlfetch.fetch(url, payload=query_data, method=method, deadline=300)

我的堆栈跟踪的尾端显示了在DeadlineExceededError之前触发url fetch调用的方法:

File "/base/data/home/apps/s~mips-conversion-scheduler/000-11.371629749593131630/views.py", line 81, in _get_mips_updated_data
policies_changed = InquiryClient().get_changed_policies(company_id, initial=initial).json()

当我查看它显示的任务队列信息时:

Method/URL: POST /tasks/queue-initial-load
Dispatched time (UTC): 2013/11/14 15:18:49
Seconds late: 0.18
Seconds to process task: 59.90
Last http response code: 500
Reason to rety: AppError

处理任务的My View如下所示:

class QueueInitialLoad(webapp2.RequestHandler):
def post(self):
    company = self.request.get("company")
    if company:
        company_id = self.request.get("company")
        queue_policy_load(company_id, queue_name="initialLoad", initial=True)

使用queue_policy_load作为触发urlfetch调用的方法。

是否有一些明显我缺失的东西让我限制在60秒超时而不是10分钟?

3 个答案:

答案 0 :(得分:1)

可能有点过于笼统,但这里有一些可能有助于关闭循环的想法。有两种任务队列,推送队列和拉队列。推送队列任务自动执行,它们仅适用于您的App Engine应用程序。另一方面,拉队列任务等待租用,可供应用程序外的工作人员使用,并且可以进行批处理。

如果要配置队列,可以在队列配置文件中执行此操作。在Java中,这发生在queue.xml文件中,在Python中发生在queue.yaml文件中。就推送队列而言,推送队列任务由处理程序(URL)作为POST请求处理。它们:

  1. 尽快执行
  2. 可能会导致新实例(前端或后端)
  3. 任务持续时间限制为10分钟
  4. 但是,如果任务在后端运行,则它们的持续时间不受限制
  5. 这是一个快速的Python代码示例,展示了如何将任务添加到命名推送队列。如果您需要更多信息,请查看任务队列的Google开发人员页面:https://developers.google.com/appengine/docs/python/taskqueue/

    将任务添加到命名推送队列:

    queue = taskqueue.Queue("Qname")
    task = taskqueue.Task(url='/handler', params=args)
    queue.add(task)
    

    另一方面,让我们说你想使用拉队列。您可以使用以下命令将Python中的任务添加到提取队列:

    queue = taskqueue.Queue("Qname")
    task = taskqueue.Task(payload=load, method='PULL')
    queue.add(task)
    

    然后,您可以使用Python中的以下方法将这些任务租借出去:

    queue = taskqueue.Queue("Qname")
    tasks = queue.lease_tasks(how-long, how-many)
    

    请记住,对于拉取队列,如果任务失败,App Engine会重试它,直到成功为止。

    希望在提供一般观点方面有所帮助!

答案 1 :(得分:0)

任务队列的截止时间为10分钟,但Urlfetch呼叫的截止时间为1分钟:

maximum deadline (request handler) 60 seconds

更新:在TaskQueue中运行时,预期的行为是最多有10分钟的URLFetch截止日期,请参阅此bug

答案 2 :(得分:0)

随着GAE的发展,这个答案与今天的#e; backend"实例已弃用。 GAE应用程序可以配置为服务(也称为模块),并使用manual扩展策略运行。这样做可以设置更长的超时。如果您使用autoscaling政策运行自己的应用,则会将您的urlfetch限制为60秒,将排队的任务限制为10分钟: https://cloud.google.com/appengine/docs/python/an-overview-of-app-engine