如何在烧瓶的背景中运行另一个python代码

时间:2018-01-29 12:55:42

标签: python python-3.x flask

@app.route('/result/<case_id>')
def result(case_id):
     USER_FOLDER = os.path.join(UPLOAD_FOLDER + '/' + Case_ID)          
     Analysis_code.main(USER_FOLDER, Case_ID, Case_ID + '_mRNA_file.txt', Case_ID + '_lncRNA_file.txt', Case_ID + '_miRNA_file.txt')

     return render_template('test.html',case_id=Case_ID)

在我的结果路径中,我调用了来自另一个文件的函数。但是当烧瓶执行Analysis_code.main()时,它没有足够的时间来运行代码。

在我的Analysis_code.main()中,关联def似乎没有完成保存文件作业,并且服务器返回网关超时错误。

def main():
    correlation(PATH, CASE_ID, mRNA_file_name, lncRNA_file_name, miRNA_file_name)
    bipartite_network(PATH, CASE_ID)

有什么方法可以解决这个问题吗?我已经搜索过子进程,但它似乎不适合我。

我试图弄清楚如何返回render_template,而另一个python代码的def调用仍然可以在后台完成。 现在,render_template必须等待函数调用完成,以便它可以返回网页。

1 个答案:

答案 0 :(得分:0)

但是其他人建议使用子流程,如果您不介意为项目增加一点复杂性,则可以使用celery异步处理此任务。

您通常可以保持相同的烧瓶路径代码,但是将要异步处理的内容移到用delay调用的celery任务中。

# you'll need to configure celery for flask
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])

@celery.task
def analysis(case_id):
    USER_FOLDER = os.path.join(UPLOAD_FOLDER + '/' + case_id) 
    Analysis_code.main(USER_FOLDER, case_id,
                       case_id + '_mRNA_file.txt',
                       case_id + '_lncRNA_file.txt',
                       case_id + '_miRNA_file.txt')

@app.route('/result/<case_id>')
def result(case_id):
    analysis.delay(case_id)
    return render_template('test.html',case_id=case_id)