代码之家  ›  专栏  ›  技术社区  ›  KevinTydlacka

谷歌云应用程序引擎灵活Python 2.7 Env错误启动新线程

  •  1
  • KevinTydlacka  · 技术社区  · 6 年前

    我知道足够多的德沃普是危险的。我已经成功地部署了一个非常简单的python flask应用程序到应用程序引擎,它基本上将接收到的post数据作为消息发布到pubsub。它和谷歌的几乎一模一样 sample code 这样做。唯一的区别是它使用我在应用程序存储库中推送的服务帐户来访问pubsub以规避 this issue .

    到目前为止工作得很好,但是我已经开始看到在 threading.py 以下内容:

    (一)

    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
    

    三)

    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
    

    我有两个问题,按重要性排序:

    1. 这是一个基本上需要100%正常运行时间才能不丢失数据的应用程序(如果我的服务器端有错误,客户端不会尝试重试)。这些错误是否与应用程序引擎管理我的应用程序资源的方式有关,而不会导致处理实际请求时出错?如何确定我是否曾以http错误响应/未成功处理请求?我在nginx日志中没有看到任何错误……这是我需要查看是否有任何失败的地方吗?
    2. 有什么方法可以纠正这个错误吗?
    2 回复  |  直到 6 年前
        1
  •  1
  •   Alex    6 年前

    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响应转发。

    希望result对象将提供有关错误的更多信息。

        2
  •  0
  •   KevinTydlacka    6 年前

    最终改变了方法论。我决定使用bigquery python客户端直接将数据流导入bq,而不是发布pubsub消息,然后通过gcs将数据流接收到bigquery。已将python flask应用程序的依赖项更新为:

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

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

    对于其他有类似问题的人,我建议更新您的依赖项(特别是任何google云客户端库),并从本地服务帐户凭据文件创建所需的客户端。我尝试使用继承的计算引擎环境凭据(基本上是默认的项目计算引擎服务帐户),但这比推送实际凭据文件并在本地使用它更不稳定。但是…在做同样的事情之前,先评估一下你自己的安全需求。