为了账号安全,请及时绑定邮箱和手机立即绑定

BigQuery Python 客户端 - 超时参数的含义以及如何设置查询结果超时

BigQuery Python 客户端 - 超时参数的含义以及如何设置查询结果超时

慕森卡 2023-07-27 16:24:43
这个问题是关于BigQuery Python客户端中QueryJob对象的方法timeout中的参数。result看起来 的含义相timeout对于 1.24.0 版本已发生变化。例如,1.24.0 版本中QueryJob 的文档result指出超时为:使用重试之前等待底层 HTTP 传输的秒数。如果在后台发出多个请求,则超时将被解释为所有请求的大致总时间。据我了解,这可以用作限制result方法调用等待结果的总时间的方法。例如,考虑以下脚本:import loggingfrom google.cloud import bigquery# Set logging level to DEBUG in order to see the HTTP requests# being made by urllib3logging.basicConfig(level=logging.DEBUG)PROJECT_ID = "project_id" # replace by actual project IDclient = bigquery.Client(project=PROJECT_ID)QUERY = ('SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '        'WHERE state = "TX" '        'LIMIT 100')TIMEOUT = 30  # in secondsquery_job = client.query(QUERY)  # API request - starts the queryassert query_job.state == 'RUNNING'# Waits for the query to finishiterator = query_job.result(timeout=TIMEOUT)rows = list(iterator)assert query_job.state == 'DONE'据我了解,如果获取结果所涉及的所有 API 调用加起来超过 30 秒,则调用将result放弃。所以,timeout这里起到了限制方法调用总执行时间的作用result。但是,后来的版本引入了更改。例如,1.27.2 中的文档result指出超时为:使用重试之前等待底层 HTTP 传输的秒数。如果在后台发出多个请求,则超时适用于每个单独的请求。如果我理解正确,上面的示例的含义完全改变,并且调用result可能需要超过 30 秒。我的疑问是:如果我使用新版本与旧版本运行上面的脚本,究竟有什么区别result?timeout目前推荐将值传递给哪些用例result?在等待查询结果时,当前推荐的在给定总时间后超时的方法是什么?谢谢。
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

正如您在此修复中所看到的:

传输层超时与查询超时无关,即等待查询完成的最长时间。

阻塞轮询使用查询超时,以便后端在轮询作业完成时不会阻塞太久,但传输可能有不同的超时要求,我们不希望它有时引发不必要的超时错误。

  • 对每个底层请求应用超时

由于作业方法不再在方法可能发出的所有请求之间分割超时,因此客户端方法以相同的方式进行调整。

所以基本的区别在于,在以前的版本中,如果在下面的层中发出许多请求,它们将共享 30 秒的超时。换句话说,如果第一个请求需要 20 秒,第二个请求将在 10 秒后超时。在新版本中,每个请求将有 30 秒的时间。

关于用例,基本上取决于您的应用程序。如果您不能长时间等待可能会丢失的请求,您可以减少超时。


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信