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 test1entity test2 都出现在单线程 worker 的日志中,但只有 entity test1 被打印在多线程 worker 上。它永远不会完成任务——它只是卡在那条线上。

任何正确方向的建议或指示都会有很大帮助。我已经为这个问题苦苦挣扎了一段时间。

我知道问题出在哪里了,当 'datastore_client' 构建它的 api 客户端时,它默认使用 gRPC。
显然,如果您使用多线程工作者,这会冻结。
通过在环境变量中将 GOOGLE_CLOUD_DISABLE_GRPC 设置为 True,您可以强制它使用 HTTPDatastoreAPI。这是'fixes'我的问题。