无法使用GCP应用程序引擎中的线程在烧瓶中运行后台作业



我有一个web应用程序,人们可以在其中上传CSV文件(没有并发上传,每天只上传一次(,CSV文件中大约有1000行。该行在firestore数据库中基于少数条件进行处理和更新,我们不希望并行运行这些提取的行,因为可能存在并发问题。

每行处理大约需要1秒,因此作业需要15分钟。这必须异步完成。我们所有的应用程序都在GCP应用程序引擎中,我的python代码如下所示

应用程序

@app.route('/batch', methods=['POST'])
def read_csv(**kwargs):
threading.Thread(target=iterate_csv_file, args=(
df, file_name, file_content)).start()

主.py

if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)

app.yaml

runtime: python37
entrypoint: gunicorn -t 120 -b :$PORT main:app
service: my-test
instance_class: F4
automatic_scaling:
min_instances: 1
max_instances: 1000
handlers:
- url: /.*
secure: always
script: auto

我在7分钟后收到以下错误(大约400行后处理(

Exception in thread Thread-58:
textPayload: "Traceback (most recent call last):
File "/layers/google.python.pip/pip/lib/python3.7/site-packages/firebase_admin/_user_mgt.py", line 837, in _make_request
return self.http_client.body_and_response(method, url, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.7/site-packages/firebase_admin/_http_client.py", line 125, in body_and_response
resp = self.request(method, url, **kwargs)
File "/layers/google.python.pip/pip/lib/python3.7/site-packages/firebase_admin/_http_client.py", line 117, in request
resp.raise_for_status()
File "/layers/google.python.pip/pip/lib/python3.7/site-packages/requests/models.py", line 940, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://identitytoolkit.googleapis.com/v1/projects/my-project/accounts" 

现在,我已经看过许多关于使用芹菜和RabbitMQ的教程。对于我的用例,是需要使用它们还是简单的后台线程应该工作?为什么我在使用后台线程时出错。此错误是否与烧瓶或GCP或某个超时有关。当这个后台线程在GCP中运行时,我正在浏览网站(会调用几个API(。我遵循了以下教程,并提出了以下代码https://pastebin.com/vnypfpU7

您不能在AppEngine标准中创建线程,运行时不是为此而设计的。如果当前未处理任何请求,则可以随时卸载实例。这是您的情况,因为不再有正在进行的请求,只是请求处理上下文之外的后台线程。

即使最小实例设置为1,也可以创建新实例并删除旧实例;1〃;受到尊重,因为您总是至少有一个实例为流量服务。

为了实现这一点,你需要创建一个云任务来调用你的应用引擎。这一次,该过程在";请求上下文";由Cloud Task创建。这不是一个用户请求,但仍然是一个在线程进程中间阻止实例卸载的请求。

最新更新