4

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

我有一个电话,urlfetch.fetch()这似乎是罪魁祸首。我的电话是:

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

我的堆栈跟踪的尾部显示了在以下内容之前触发 url fetch 调用的方法DeadlineExceededError

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

我处理任务的视图如下所示:

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 分钟?

4

3 回答 3

1

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

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

  1. 尽快执行
  2. 可能会导致新实例(前端或后端)
  3. 任务持续时间限制为 10 分钟
  4. 但是,如果任务在后端运行,它们的持续时间是无限的

这是一个快速的 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 会重试它,直到它成功。

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

于 2014-04-05T07:14:53.203 回答
0

任务队列有 10 分钟的最后期限,但 Urlfetch 调用有 1 分钟的最后期限:

最大期限(请求处理程序) 60 秒

更新:预期的行为是在 TaskQueue 中运行时 URLFetch 的截止时间最长为 10 分钟,请参阅此错误

于 2013-11-14T15:45:15.437 回答
0

随着 GAE 的发展,这个答案适用于今天已弃用“后端”实例的想法。GAE 应用程序可以配置为服务(又名模块)并使用manual扩展策略运行。这样做可以设置更长的超时时间。如果您使用autoscaling策略运​​行您的应用程序,它会将您的 urlfetch 限制为 60 秒,您的排队任务限制为 10 分钟: https ://cloud.google.com/appengine/docs/python/an-overview-of-app-engine

于 2016-10-17T12:25:49.273 回答