Google云Python灵活环境多线程数据库工作者冻结
问题描述:
我在Google App Engine Python Flexible Environment上为重负载运行灵活的服务。我运行PSQ workers to handle tasks through Pub/Sub。Google云Python灵活环境多线程数据库工作者冻结
只要我与单线程工作人员一起工作,这就是一切都很好。在单线程的工人,如果我实例化一个数据存储客户端,像这样:
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
。这'修复'我的问题。