Google 云 Python 灵活环境多线程数据库工作者冻结
Google Cloud Python Flexible Environment Multithreaded database worker freezes
我 运行 为 Google App Engine Python Flexible Environment. I run PSQ workers to handle tasks through Pub/Sub 上的重负载提供灵活的服务。
只要我使用单线程 worker,这一切都很好。在单线程工作者上,如果我像这样实例化一个数据存储客户端:
from google.cloud import datastore
_client = datastore.Client(project='project-name-kept-private')
...并检索一个实体:
entity = _client.get(_client.key('EntityKind', 1234))
...它工作正常。
但是,一旦我在多线程工作程序中执行完全相同的操作,它就会在最后一行冻结:
entity = _client.get(_client.key('EntityKind', 1234))
我知道它在这一行完全失败,因为我在该特定行之前和之后使用 logging.error
,如下所示:
import logging
logging.error('entity test1')
entity = _client.get(_client.key('EntityKind', 1234))
logging.error('entity test2')
行 entity test1
和 entity test2
都出现在单线程 worker 的日志中,但只有 entity test1
被打印在多线程 worker 上。它永远不会完成任务——它只是卡在那条线上。
任何正确方向的建议或指示都会有很大帮助。我已经为这个问题苦苦挣扎了一段时间。
我知道问题出在哪里了,当 'datastore_client' 构建它的 api 客户端时,它默认使用 gRPC。
显然,如果您使用多线程工作者,这会冻结。
通过在环境变量中将 GOOGLE_CLOUD_DISABLE_GRPC
设置为 True
,您可以强制它使用 HTTPDatastoreAPI
。这是'fixes'我的问题。
我 运行 为 Google App Engine Python Flexible Environment. I run PSQ workers to handle tasks through Pub/Sub 上的重负载提供灵活的服务。
只要我使用单线程 worker,这一切都很好。在单线程工作者上,如果我像这样实例化一个数据存储客户端:
from google.cloud import datastore
_client = datastore.Client(project='project-name-kept-private')
...并检索一个实体:
entity = _client.get(_client.key('EntityKind', 1234))
...它工作正常。
但是,一旦我在多线程工作程序中执行完全相同的操作,它就会在最后一行冻结:
entity = _client.get(_client.key('EntityKind', 1234))
我知道它在这一行完全失败,因为我在该特定行之前和之后使用 logging.error
,如下所示:
import logging
logging.error('entity test1')
entity = _client.get(_client.key('EntityKind', 1234))
logging.error('entity test2')
行 entity test1
和 entity test2
都出现在单线程 worker 的日志中,但只有 entity test1
被打印在多线程 worker 上。它永远不会完成任务——它只是卡在那条线上。
任何正确方向的建议或指示都会有很大帮助。我已经为这个问题苦苦挣扎了一段时间。
我知道问题出在哪里了,当 'datastore_client' 构建它的 api 客户端时,它默认使用 gRPC。
显然,如果您使用多线程工作者,这会冻结。
通过在环境变量中将 GOOGLE_CLOUD_DISABLE_GRPC
设置为 True
,您可以强制它使用 HTTPDatastoreAPI
。这是'fixes'我的问题。