猿问

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

这个问题是关于BigQuery Python客户端中QueryJob对象的方法timeout中的参数。result

看起来 的含义相timeout对于 1.24.0 版本已发生变化。

例如,1.24.0 版本中QueryJob 的文档result指出超时为:

使用重试之前等待底层 HTTP 传输的秒数。如果在后台发出多个请求,则超时将被解释为所有请求的大致总时间。

据我了解,这可以用作限制result方法调用等待结果的总时间的方法。

例如,考虑以下脚本:

import logging


from google.cloud import bigquery


# Set logging level to DEBUG in order to see the HTTP requests

# being made by urllib3

logging.basicConfig(level=logging.DEBUG)


PROJECT_ID = "project_id" # replace by actual project ID


client = 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 seconds

query_job = client.query(QUERY)  # API request - starts the query

assert query_job.state == 'RUNNING'


# Waits for the query to finish

iterator = 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 秒。

我的疑问是:

  1. 如果我使用新版本与旧版本运行上面的脚本,究竟有什么区别result

  2. timeout目前推荐将值传递给哪些用例result

  3. 在等待查询结果时,当前推荐的在给定总时间后超时的方法是什么?

谢谢。


慕森卡
浏览 88回答 1
1回答

MYYA

正如您在此修复中所看到的:传输层超时与查询超时无关,即等待查询完成的最长时间。阻塞轮询使用查询超时,以便后端在轮询作业完成时不会阻塞太久,但传输可能有不同的超时要求,我们不希望它有时引发不必要的超时错误。对每个底层请求应用超时由于作业方法不再在方法可能发出的所有请求之间分割超时,因此客户端方法以相同的方式进行调整。所以基本的区别在于,在以前的版本中,如果在下面的层中发出许多请求,它们将共享 30 秒的超时。换句话说,如果第一个请求需要 20 秒,第二个请求将在 10 秒后超时。在新版本中,每个请求将有 30 秒的时间。关于用例,基本上取决于您的应用程序。如果您不能长时间等待可能会丢失的请求,您可以减少超时。
随时随地看视频慕课网APP

相关分类

Python
我要回答