应用程序引擎上的线程安全客户端lib(python)

时间:2016-06-14 08:27:20

标签: python multithreading google-app-engine google-bigquery google-app-engine-python

我在Google的一个git存储库中找到了一些关于bigquery插入的示例代码。

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

如果你看到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)

1 个答案:

答案 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中的代码,那么我怀疑您处于线程状态。