看来你是解决问题的方法之一
我们需要一名后台工作人员来处理大量数据/文件。如果需要很好的处理时间。
在处理我们无法控制的后台任务时,我们需要数据库帮助来跟踪作业状态
按照步骤完成任务,
第 1 步:在您的主要路线中执行主要步骤,例如读取请求(例如:.csv 文件)并进行验证,
第 2 步:创建一个查找表以跟踪工作状态
此表是一个占位符,用于跟踪您的后台作业状态
- 最初它将状态保存为队列并将作业返回到进程#step5
- 第三步
- 返回作业 ID
第三步: redis enque : 通过redis enque调用处理辅助函数并传递所有需要的args,根据需要设置超时值
第 4 步:进行处理并更新状态记录成功/失败
第 5 步:创建另一个路由以返回该作业的当前状态,对该路由进行持续 AJAX 调用,直到状态更改为完成
通过下面的示例了解更多详细信息,假设您已经为 #ref
做好了所有 redis 设置(如安装、worke.py、建立 redis 连接等)
Modles.py(我正在使用 Mongo DB 作为 ex)
class TempCsvLookup(Base, Document):
id = SequenceField(unique=True)
job_id = StringField()
file_url = StringField()
status = StringField()
created_at = DateTimeField(default=dt.utcnow(), required=True)
finished_at = DateTimeField(default=(dt.utcnow() + datetime.timedelta(hours=24)))
views.py
@route('/upload_csv_file', methods=['POST'])
@require_login
def upload_csv_file():
#step 1
csv_file = request.form.get('file')
'''
do validations
'''
#Step 2: create a initial DB record
look_up = TempCsvLookup(
status = "Queued"
).save()
#step_3 : calling backgroud task using redis
job = redis_queue.enqueue(
process_csv_file,
args = (
look_up, csv_file, other_args
),
timeout = 1200
)
job.get_id()
look_up.update(
set__job = job.get_id(),
)
return jsonfy(job_id = str(job.get_id()))
def process_csv_file(look_up, csv_file, other_args):
try:
#step 4 process csv file
look_up.update(
set__status = "Processing",
)
"""
1.do all processing with input csv file
2.create new csv file
"""
look_up.update(
set__status = "Completed",
set__file_url = new_file_path,
set__finished_at = dt.utcnow()
)
except Exception as e:
look_up.update(
set__status = "Failed",
set__finished_at = dt.utcnow()
)
@route('/csv_file_lookup/<string:lookup_job_id>', methods=['GET'])
@require_login
def csv_file_lookup(lookup_job_id):
#step5
report = TempCsvLookup.objects(job_id=lookup_job_id).first()
resp = {
'status': report.status,
'file_url': report.file_url
}
return response.success(data=resp)
希望对你有帮助