我有一个任务处理程序,它正在向Google Calendar API发出批量请求。5秒后,请求失败并返回DeadlineExceededError: API调用urlfetch.Fetch()花费了太长时间来响应并被取消。我在我发出批处理请求的地方附近改变了urlfetch.set_default_fetch_deadline(60)
,正如这里建议的那样,但它似乎没有什么不同:截止日期似乎仍然是5秒。
我正在使用Python谷歌API客户端库,它位于oauth2client和httplib2之上。但我的理解是,GAE拦截使用urlfetch.Fetch的底层调用。这似乎也是堆栈跟踪所显示的。
你能看出urlfetch.set_default_fetch_deadline
不工作的原因吗?
编辑:
这是用来构建批处理请求的代码:
# note `http` is a oauth2client authorized http client
cal = apiclient.discovery.build('calendar','v3',http=http)
req = cal.new_batch_http_request(callback=_callback)
for event in events: # anything larger than ~5 events in batch takes >5 secs
req.add(
cal.events().patch(calendarId=calid, eventId=event["id"], body=self._value)
)
urlfetch.set_default_fetch_deadline(60) # has no effect
req.execute()
所以,urlfetch.set_default_fetch_deadline()
最终为我工作。问题是我的底层http客户端(oauth2client/httplib2)基本上存储在全局。一旦我在任务处理程序线程中创建了它,set_default_fetch_deadline
就工作了。
尝试添加deadline
参数:
my_result = urlfetch.fetch(my_url, deadline=15)