我在Google的一个git存储库中找到了一些关于bigquery插入的示例代码。
如果你看到app.yaml,它说这段代码应该是线程安全的,但是如果我在客户端lib的文档(https://developers.google.com/api-client-library/python/guide/thread_safety)中,它应该是线程安全的。我现在有点困惑,我的下面的代码是否是线程安全的? 它正在app引擎标准环境中运行。
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)
----更新---- Tim回答后,我将代码更改为以下内容。这应该是好的:
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)
答案 0 :(得分:1)
如果你阅读了你引用的文档,那么
google-api-python-client库构建于httplib2之上 库,不是线程安全的。因此,如果您正在运行 多线程应用程序,您正在发出请求的每个线程 from必须有自己的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中的代码,那么我怀疑您处于线程状态。