我在Google App Engine Python Flexible Environment上运行一个灵活的服务来应对重载。我运行 PSQ 工作人员通过发布/订阅处理任务。
只要我与单线程工人一起工作,这一切都很好。在单线程工作线程上,如果我像这样实例化数据存储客户端:
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
都显示在单线程工作线程的日志中,但只有entity test1
打印在多线程工作线程上。它永远不会完成任务——它只是卡在那条线上。
任何正确的建议或方向的指示都会有很大帮助。我一直在为这个问题而苦苦挣扎。
我弄清楚了问题所在,当"datastore_client"构造其 api 客户端时,默认情况下它使用 gRPC。
显然,如果您使用多线程工作线程,这会冻结。
通过将环境变量中的GOOGLE_CLOUD_DISABLE_GRPC
设置为True
,可以强制它使用HTTPDatastoreAPI
。这"解决"了我的问题。