1

Я нашел небольшой пример кода о вставке bigquery в одном из репозиториев git Google.Thread safe client lib на движке приложения (python)

https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/appengine/standard/bigquery/main.py

Если вы видите app.yaml он говорит, что этот код должен быть поточно, но если я lokking в документации клиента библитеками (https://developers.google.com/api-client-library/python/guide/thread_safety) она не должна быть поточно. Я немного запутался, что мой следующий код является потокобезопасным или нет? Он работает на стандартном env приложения.

import pprint 

from googleapiclient.discovery import build 
from oauth2client.client import GoogleCredentials 


credentials = GoogleCredentials.get_application_default() 

# Create the bigquery api client 
service = build('bigquery', 'v2', credentials=credentials) 

response = service.datasets().list(projectId='PROJECTID').execute() 

pprint.pprint(response) 

---- UPDATE ---- После ответа Тима я изменил свой код к следующему. Это должно быть хорошо сейчас:

import pprint 

from googleapiclient.discovery import build 
from oauth2client.contrib.appengine import AppAssertionCredentials 
import httplib2 


credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/bigquery') 


# Create the bigquery api client 
service = build('bigquery', 'v2') 


def get(): 
    # authorize http object with client credentials 
    http = credentials.authorize(httplib2.Http()) 
    response = service.datasets().list(projectId='PROJECTID').execute(http=http) 

    pprint.pprint(response) 

ответ

1

Если вы читали документы вы ссылаетесь это говорит библиотека

в системе Google апи-питон-клиент построен на вершине библиотеки httplib2 , которая не является потокобезопасный. Таким образом, если вы работаете как многопоточное приложение, каждый поток, который вы делаете запросы , должен иметь свой собственный экземпляр httplib2.Http().

Затем они затем покажут, как это сделать. Если вы будете следовать инструкциям, тогда да.

Вы образец код слишком прост и не пытается что описано в документации

# Create a new Http() object for every request 
    def build_request(http, *args, **kwargs): 
    new_http = httplib2.Http() 
    return apiclient.http.HttpRequest(new_http, *args, **kwargs) 
    service = build('api_name', 'api_version', requestBuilder=build_request) 

    # Pass in a new Http() manually for every request 
    service = build('api_name', 'api_version') 
    http = httplib2.Http() 
    service.stamps().list().execute(http=http) 

Так что, если вы пробовали свой код в резьбовых ситуациях не будет поточно. Если вы просто пытаетесь использовать этот код из REPL, я сомневаюсь, что вы в многопоточной ситуации.

+1

Не могли бы вы взглянуть на обновление, пожалуйста? благодаря –