首页 > 解决方案 > 当我使用烧瓶 + uwsgi + nginx 将烧瓶部署到服务器时,多进程无法在烧瓶中工作

问题描述

我正在使用flask + uwsgi + nginx 在服务器上部署网站。

在flask中,我的代码如下,这是我想要设计的:每次点击运行模型时,它会在另一个进程中运行一个模型,但界面会立即链接到等待界面。

train_dataset.status = status
db.session.commit()
text = 'Start training your models, please wait for a while or check results several hours later'

# would run a model in another process
task = Process(target=start_train, args=(app.config['UPLOAD_FOLDER'], current_user.id, p.id, p.task), name="training.exe")
task.start()
print(task.pid, task.name)
session[f"{project_name}_train"] = task.pid

# in the meanwhile, link to waiting interface
return render_template('p_computeview.html', project_name=project_name, text=text,
                               status=status, p=p, email=email, not_identify=not_identify)

当我在本地开发环境中测试时

app.run()

没关系,当我点击运行模型时,界面只是链接到等待界面,我可以看到模型运行日志。但是当我部署到服务器时,我选择了 uwsgi + nginx + flask。

在 uwsgi.ini 中,我已经指定了进程

processes=2
threads=5

但是当我点击运行模型的时候,界面还是静止的,并没有链接到等待界面,但是我可以看到模型运行日志,并且建模完成后,界面会链接到等待界面(证明过程功能没有在职的 ??)

我的服务器有 2 个 cpu,所以我认为它可以支持多进程

有人能帮我吗 ?我猜 uwsgi 或 nginx 有一些问题?

标签: pythonnginxflaskuwsgi

解决方案


在请求上下文中运行单独的线程或进程的愿望是一种常见的愿望。出于各种原因,除了在非常狭窄的情况下,这是一种导致挫败感的愿望。在这种情况下,一旦task超出范围,Process机器就会被拆除。

如果您想从请求处理程序启动一个长时间运行的任务,请使用像celeryRq这样的框架,它们安排完全从 http 服务器的进程之外运行作业。


推荐阅读