#python #google-bigquery #google-cloud-python
#питон #google-bigquery #google-облако-python
Вопрос:
Этот вопрос касается timeout
параметра в result
методе объектов QueryJob в клиенте BigQuery Python.
Похоже, что значение timeout
изменилось по отношению к версии 1.24.0.
Например, в документации для QueryJob result
в версии 1.24.0 указано, что тайм-аут равен:
Количество секунд для ожидания базового 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
вызова метода.
Однако в более поздних версиях были внесены изменения. Например, в документации для result
в 1.27.2 указано, что время ожидания равно:
Количество секунд для ожидания базового HTTP-транспорта перед использованием повторной попытки. Если одновременно выполняется несколько запросов, тайм-аут применяется к каждому отдельному запросу.
Если я правильно понимаю это, приведенный выше пример полностью меняет смысл, и вызов result
потенциально может занять более 30 секунд.
Мои сомнения заключаются в следующем:
- В чем именно разница в приведенном выше скрипте, если я запускаю его с новой версией
result
по сравнению со старой версией? - Каковы в настоящее время рекомендуемые варианты использования для передачи
timeout
значенияresult
? - Каков рекомендуемый в настоящее время способ тайм-аута по истечении заданного общего времени ожидания результатов запроса?
Спасибо.
Комментарии:
1. Если ответ вам как-то помог, подумайте о том, чтобы принять его или проголосовать за него
Ответ №1:
Как вы можете видеть в этом исправлении:
Тайм-аут транспортного уровня не зависит от тайм-аута запроса, то есть максимального времени ожидания завершения запроса.
Тайм-аут запроса используется блокирующим опросом, чтобы серверная часть не блокировалась слишком долго при опросе для завершения задания, но у транспорта могут быть разные требования к тайм-ауту, и мы не хотим, чтобы иногда возникали ненужные ошибки тайм-аута.
- Применяйте тайм-аут к каждому из базовых запросов
Поскольку методы задания больше не разделяют время ожидания между всеми запросами, которые может выполнять метод, методы клиента настраиваются таким же образом.
Итак, основное отличие заключается в том, что в предыдущей версии, если на уровне ниже было сделано много запросов, они разделяли бы тайм-аут в 30 секунд. Другими словами, если первый запрос занимает 20 секунд, то второй истекает через 10 секунд. В новой версии на каждый отдельный запрос будет отводиться 30 секунд.
Что касается варианта использования, в основном это зависит от вашего приложения. Если вы не можете долго ждать запроса, который может быть потерян, вы можете уменьшить время ожидания.