Google Cloud App Engine Flexible Python 2.7 Env错误启动新线程

时间:2018-07-17 16:18:28

标签: python google-app-engine nginx google-cloud-platform google-app-engine-python

我知道有足够的危险。我已成功将非常简单的python flask应用程序部署到App Engine,该应用程序基本上将收到的帖子数据作为消息发布到PubSub。这样做几乎与Google的sample code相同。唯一的不同是它使用了我在应用程序存储库中推送的服务帐户来访问PubSub以规避this issue

到目前为止,效果很好,但是在threading.py中启动新线程时,我已经开始看到很少的错误:

1)

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread
  File "/usr/lib/python2.7/threading.py", line 736, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

2)

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread

3)

Traceback (most recent call last):
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 33, in grpc._cython.cygrpc._spawn_callback_async
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread
  File "src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi", line 24, in grpc._cython.cygrpc._spawn_callback_in_thread
  File "/usr/lib/python2.7/threading.py", line 736, in start
  File "/usr/lib/python2.7/threading.py", line 736, in start

按重要性顺序,我有2个问题:

  1. 这是一个基本上需要100%正常运行时间才能不丢失数据的应用程序(如果我的服务器端发生错误,则不能确信客户端会尝试重试)。这些错误是否是App Engine管理我的应用程序资源的内部原因,而不是导致处理实际请求时出错?如何确定我是否曾响应HTTP错误/未成功处理请求?我的nginx日志中没有看到任何错误...是需要查看是否有任何故障的地方吗?
  2. 有什么办法可以解决此错误?

2 个答案:

答案 0 :(得分:1)

https://github.com/GoogleCloudPlatform/google-cloud-python/blob/master/pubsub/google/cloud/pubsub_v1/publisher/client.py#L143

看起来publisher.publish(topic_path, data=data)是一个异步操作,返回了一个concurrent.futures.Future对象

您是否尝试称呼未来的result()https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result

这将阻塞,直到将来的对象成功,失败或超时为止。

然后您可以将该结果作为HTTP响应转发。

希望结果对象将为您提供有关错误的更多信息。

答案 1 :(得分:0)

最终改变了方法。而不是发布pubsub消息,而是通过GCS将数据流提取到BigQuery,我决定使用BigQuery python客户端直接将其流式传输到BQ。将python flask应用程序的依赖关系更新为:

Flask==1.0.2
google-cloud-pubsub==0.39.1
gunicorn==19.9.0

google-cloud-bigquery==1.11.2

,我再也看不到任何例外了。值得注意的是,我仍在与应用程序源位于同一目录中使用服务帐户.json凭据文件,并且正在使用以下方法创建BigQuery客户端: bq_client = bigquery.Client.from_service_account_json(BQ_SVC_ACCT_FILE)

对于其他有类似问题的人,我建议您更新依赖关系(尤其是任何Google Cloud客户端库),并从本地服务帐户凭据文件创建所需的客户端。我尝试使用继承的Compute Engine环境凭据(基本上是默认的项目计算引擎服务帐户),但它比推送实际的凭据文件并在本地使用该凭据不稳定。但是...在进行同样的评估之前,先评估自己的安全需求。