DeadlineExceededError:超出了响应HTTP请求的总截止日期

时间:2017-08-09 14:48:48

标签: python google-app-engine google-cloud-datastore google-cloud-platform

我有一个cron作业,它调用vendor api来获取公司列表。获取数据后,我们将该数据存储到云数据存储区中,如下面的代码所示。出于某种原因,在我触发cron作业的最后两天,开始看到错误。当我在本地调试代码时,我没有看到此错误

print(courseB.update_views())

存储库代码

    company_list = cron.rest_client.load(config, "companies", '')

    if not company_list:
        logging.info("Company list is empty")
        return "Ok"

    for row in company_list:
        company_repository.save(row,original_data_source, 
                                 actual_data_source)

错误

  def save( dto, org_ds , act_dp):
   try:
    key = 'FIN/%s' % (dto['ticker'])
    company = CompanyInfo(id=key)
    company.stock_code = key
    company.ticker = dto['ticker']
    company.name = dto['name']
    company.original_data_source = org_ds
    company.actual_data_provider = act_dp
    company.put()
    return company
  except Exception:
    logging.exception("company_repository: error occurred saving the 
                       company record ")
    raise

异常详情

  DeadlineExceededError: The overall deadline for responding to the 
                          HTTP request was exceeded.

2 个答案:

答案 0 :(得分:2)

贵公司的名单是否已经变大了?

你想放几个实体?

尝试将它们作为批处理保存,而不是按循环顺序保存。从<Router> <ScrollToTop> <div> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Link to="/">Home</Link>{' '} <Link to="/about">About</Link> </div> </ScrollToTop> </Router> 移除company.put(),然后使用def save( dto, org_ds , act_dp):

ndb.put_multi()

答案 1 :(得分:1)

我的答案基于Alex给出的答案,但运行async

我已将put_multi()替换为put_multi_async()

  

通过调用异步等效put_multi()来取代对put_multi_async()的调用,应用程序可以立即执行其他操作,而不是在put_multi()上阻止。

并添加了@ndb.toplevel装饰器

  

这个装饰器告诉处理程序在异步请求完成之前不要退出

如果您的数据越来越大,您可能希望深入了解defered library。它可用于每X批次重新生成任务,剩余的未处理数据。

@ndb.toplevel
def fetch_companies_list():
    company_list = cron.rest_client.load(config, "companies", '')

    if not company_list:
        logging.info("Company list is empty")
        return "Ok"

    company_objs=[]
    for row in company_list:
        company_objs.append(company_repository.save(row,original_data_source, 
                             actual_data_source))
        # put 500 at a time
        if len(company_objs) >= 500:
            ndb.put_multi_async(company_objs)
            company_objs=[]
    # put any remainders
    if len(company_objs) > 0:
        ndb.put_multi_async(company_objs)