这个问题是关于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 秒的时间。
关于用例,基本上取决于您的应用程序。如果您不能长时间等待可能会丢失的请求,您可以减少超时。
添加回答
举报
0/150
提交
取消