我正在尝试通过任务队列在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分钟?
答案 0 :(得分:1)
可能有点过于笼统,但这里有一些可能有助于关闭循环的想法。有两种任务队列,推送队列和拉队列。推送队列任务自动执行,它们仅适用于您的App Engine应用程序。另一方面,拉队列任务等待租用,可供应用程序外的工作人员使用,并且可以进行批处理。
如果要配置队列,可以在队列配置文件中执行此操作。在Java中,这发生在queue.xml文件中,在Python中发生在queue.yaml文件中。就推送队列而言,推送队列任务由处理程序(URL)作为POST请求处理。它们:
这是一个快速的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