我在Google App Engine Python Flexible Environment上为重负载运行灵活的服务。我跑PSQ workers to handle tasks through Pub/Sub。
只要我与单线程工作者合作,这一切都很好。在单线程工作者上,如果我像这样实例化数据存储客户端:
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
才会打印在多线程工作程序上。它永远不会完成任务 - 它只是卡在那条线上。
正确方向的任何建议或指示都会有很大的帮助。我已经在很长一段时间内一直在努力解决这个问题。
答案 0 :(得分:0)
我弄清楚问题是什么,当'datastore_client'构造其api客户端时,它默认使用gRPC。
如果你使用多线程工作人员,显然这会冻结。
通过在环境变量中将GOOGLE_CLOUD_DISABLE_GRPC
设置为True
,您可以强制它使用HTTPDatastoreAPI
。这“解决了”我的问题。