Google Cloud Python灵活环境多线程数据库工作人员冻结

时间:2017-10-19 14:04:40

标签: python multithreading google-app-engine google-cloud-pubsub app-engine-flexible

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

正确方向的任何建议或指示都会有很大的帮助。我已经在很长一段时间内一直在努力解决这个问题。

1 个答案:

答案 0 :(得分:0)

我弄清楚问题是什么,当'datastore_client'构造其api客户端时,它默认使用gRPC。
如果你使用多线程工作人员,显然这会冻结。
通过在环境变量中将GOOGLE_CLOUD_DISABLE_GRPC设置为True,您可以强制它使用HTTPDatastoreAPI。这“解决了”我的问题。