没有Celery或Redis的具有进度跟踪的后台任务

问题描述 投票:1回答:1

我的项目从一项服务导出到另一项服务。为此,需要一个漫长的后台任务并将进度显示为一些文本,例如进度current step。一个问题是如何从冗长的任务中获取此文本。

我知道CeleryRedis。但这需要服务器等其他资源。我的项目太小,每月不能有超过两个人参加。因此,我不想购买共享主机或计算机。

我试图将此current step text保存到session。但是long task期间的响应始终为null。我认为是因为flask正在处理任务,并且没有为session返回有效值。试图在新线程中运行任务。然后我收到关于从错误的线程访问会话的错误。

python flask redis celery python-multithreading
1个回答
1
投票

我的解决方案

创建全局字典

step = dict()

创建随机key,并将此密钥与全局步骤一起提供给模块后台任务。启动一个新线程并返回键。

@app.route('/api/transfer', methods=['post'])
def api_transfer():
    global step
    key = token_urlsafe(10)

    service = Service(step, key, session.get('token'))

    t = threading.Thread(target=long_task, args=(service,))
    t.start()

    return {'key': key}

并使用此键发送请求以获取响应的当前步骤

@app.route('/api/transfer/current_step', methods=['post'])
def api_current_step():
    global step
    return {'step': step[request.json['key']]}

现在,对于每个导出请求,仅会为其创建新的密钥和文本

{'jlIG7VKtbMHtXg': 'some step for jlIG7VKtbMHtXg'}
{'jlIG7VKtbMHtXg': 'some step for jlIG7VKtbMHtXg', 'wxr4jKyP7c72sg': 'some step for wxr4jKyP7c72sg'}

并且在任务结束时,从字典中删除此键

del self.step[self.key]
© www.soinside.com 2019 - 2024. All rights reserved.