Google Cloud App Engine 灵活 Python 2.7 环境错误启动新线程
Google Cloud App Engine Flexible Python 2.7 Env Errors starting new threads
我知道 devops 足够危险。我已经成功地将一个非常简单的 python flask 应用程序部署到 App Engine,它基本上将收到的 post 数据作为消息发布到 PubSub。它几乎与 Google 的 sample code to do so. Only difference is it uses a service account I push with the app repository to access PubSub to circumvent 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 个问题,按重要性排序:
- 这是一个基本上需要 100% 正常运行时间才能不丢失数据的应用程序(如果我的服务器端出现错误,客户端会尝试重试,我不确定)。这些错误是否在 App Engine 管理我的应用程序资源的内部,并且不会导致处理实际请求的错误?如何确定我是否曾使用 HTTP error/didn 响应未成功处理请求?我在我的 nginx 日志中没有看到任何错误...这是我需要查看是否有任何失败的地方吗?
- 有什么方法可以修复这个错误吗?
看起来publisher.publish(topic_path, data=data)
是一个异步操作,返回一个concurrent.futures.Future
对象
你试过打电话给未来的 result()
吗? https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result
这将阻塞,直到未来的对象成功、失败或超时。
然后您可以将该结果作为 HTTP 响应转发。
希望结果对象能为您提供有关错误的更多信息。
最后稍微改变了方法。我没有发布 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 云客户端库)并从本地服务帐户凭据文件创建您需要的客户端。我尝试使用继承的计算引擎环境凭据(基本上是默认的项目计算引擎服务帐户),但这不如推送实际的凭据文件并在本地使用它那么稳定。然而......在做同样的事情之前评估你自己的安全需求。
我知道 devops 足够危险。我已经成功地将一个非常简单的 python flask 应用程序部署到 App Engine,它基本上将收到的 post 数据作为消息发布到 PubSub。它几乎与 Google 的 sample code to do so. Only difference is it uses a service account I push with the app repository to access PubSub to circumvent 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 个问题,按重要性排序:
- 这是一个基本上需要 100% 正常运行时间才能不丢失数据的应用程序(如果我的服务器端出现错误,客户端会尝试重试,我不确定)。这些错误是否在 App Engine 管理我的应用程序资源的内部,并且不会导致处理实际请求的错误?如何确定我是否曾使用 HTTP error/didn 响应未成功处理请求?我在我的 nginx 日志中没有看到任何错误...这是我需要查看是否有任何失败的地方吗?
- 有什么方法可以修复这个错误吗?
看起来publisher.publish(topic_path, data=data)
是一个异步操作,返回一个concurrent.futures.Future
对象
你试过打电话给未来的 result()
吗? https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result
这将阻塞,直到未来的对象成功、失败或超时。
然后您可以将该结果作为 HTTP 响应转发。
希望结果对象能为您提供有关错误的更多信息。
最后稍微改变了方法。我没有发布 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 云客户端库)并从本地服务帐户凭据文件创建您需要的客户端。我尝试使用继承的计算引擎环境凭据(基本上是默认的项目计算引擎服务帐户),但这不如推送实际的凭据文件并在本地使用它那么稳定。然而......在做同样的事情之前评估你自己的安全需求。