我知道有足够的危险。我已成功将非常简单的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个问题:
答案 0 :(得分:1)
看起来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环境凭据(基本上是默认的项目计算引擎服务帐户),但它比推送实际的凭据文件并在本地使用该凭据不稳定。但是...在进行同样的评估之前,先评估自己的安全需求。