【发布时间】:2019-10-19 10:26:28
【问题描述】:
我有一个使用 Flask_restful、Flask_CORS 和 Marshmallow 的 Flask API。 API 执行一些工作以将 *.csv 文件获取到 Cloud Storage(使用 signedURL),确认它已上传,然后创建并执行加载作业以将 csv 从 Storage 传输到 BigQuery。 API 中加剧我脱发的部分是调用在 GCP 中执行加载作业,将 csv 文件加载到 BigQuery。这是代码的sn-p:
...
dataset_ref = bq_client.dataset(target_dataset)
job_config.schema = bq_schema
job_config.source_format = SOURCE_FORMAT
job_config.field_delimiter = DELIM
job_config.destination_table_description = TARGET_TABLE
job_config.encoding = ENCODING
job_config.max_bad_records = MAX_BAD_RECORDS
job_config.autodetect = False # Do not autodetect schema
load_job = bq_client.load_table_from_uri(
uri, dataset_ref.table(target_table), job_config=job_config
) # API request
load_job.result() # **<-- This is the concern**
return {"message": "Successfully uploaded to Bigquery"}, 200
传输文件可能需要一些时间,我担心的是,在有一些延迟的期间,网络服务器会在等待传输发生时超时。我更希望让load_job.result() 执行,获取作业 ID 并返回 201 响应。然后我可以使用作业 ID 来轮询 GCP 以确定它是否成功,而不会有客户端前端的请求超时的风险,让用户对它是否成功感到困惑不是。
我知道 load_job.result() 是异步的,但是对于 Flask 没有帮助。我打算改用 Quart 来使用 async/await,但我的其他依赖项不受支持,因此我需要进行大量重构。还有其他人用来解决此类问题的方法吗? 干杯
【问题讨论】:
-
我将重新表述,以确定您想要做什么:您想使用 Quart 在异步模式下运行加载作业,然后在作业完成时使用回调?跨度>
-
这就是我想做的,但 Quart 不支持 flask_cors 或 flask_restful 所以我正在寻找替代品。到目前为止,我倾向于只使用 RQ 并有一个任务队列来执行此操作。
标签: python flask google-cloud-platform google-bigquery