此问题与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秒钟以上的时间。
我的怀疑是:
result
的旧脚本与旧版本的脚本一起运行,上面的脚本到底有什么区别?timeout
值传递给哪些用例result
?谢谢。
正如您在此修复程序中看到的:
使传输层超时与查询超时无关,即等待查询完成的最长时间。
查询超时由阻塞轮询使用,以使后端在为完成作业而轮询时不会阻塞太长时间,但是传输可能具有不同的超时要求,我们不希望它引起有时不必要的超时错误。
- 将超时应用于每个基础请求
由于作业方法不再在方法可能发出的所有请求之间分配超时,因此以相同方式调整客户端方法。
因此,基本区别在于,在以前的版本中,如果在下面的层中进行了许多请求,则它们将共享30秒的超时时间。换句话说,如果第一个请求花费20秒,第二个请求将在10秒后超时。在新版本中,每个单个请求将有30秒。
关于用例,基本上它取决于您的应用程序。如果您不能长时间等待可能丢失的请求,则可以减少超时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句