我有一个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.
答案 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)