【发布时间】:2015-11-18 10:50:11
【问题描述】:
我正在开发一个小型 python/flask 项目,该项目将繁重的计算例程与浏览器界面连接起来。出于实际原因,我必须将计算保留在后台进程中,并在计算完成后重新加载/重定向页面(带有输出结果)。以下是我目前所拥有的最小代码(以相反的顺序):
interface.py
from flask import Flask
from threading import Thread
import time
app = Flask(__name__)
# step 4: rerender browser with output data
@app.route('/done')
def done(data_to_pass):
# rerender browser's html here?
print data_to_pass
return data_to_pass
# step 3: heavy computation routine
def background():
print "start runing backgroun process"
time.sleep(3) # simulate heavy computation routine
data = 'done from background'
done(data)
# step 2: initiate background process
def init():
t = Thread(target=background)
t.daemon = True
t.start()
# step 1: home interface
@app.route('/')
def front_end():
init()
return 'initiate bachground process'
if __name__ == '__main__':
app.run()
interface.py 运行时,在浏览器中访问 127.0.0.1:5000 会得到一个字符串initiate bachground process。但是,最终数据(在这种情况下为字符串done from background)仅在服务器的终端中处理,而不是在浏览器中处理。
我相信大多数服务器通常都会执行此过程,但我找不到任何烧瓶解决方案......还是我走错了方向?
【问题讨论】:
-
当你到达
/done路由时会发生什么? -
你的意思是直接从浏览器访问127.0.0.1:5000/done?在此设置下,
done期望来自函数调用的输入参数。所以直接从地址 127.0.0.1:5000/done 访问它会导致内部服务器错误。 -
您是否打算使用
/done路由进行投票?所以你会首先请求/,然后每隔一段时间调用/done,直到它返回一些东西? -
我想到的是首先请求
/,当计算完成时,它会从服务器端调用/done。我不知道应该怎么做,我虽然可以纯粹从烧瓶方面来实现(不会弄乱javascript或任何东西)......但也许我必须接受@barjey的建议 -
如果您不想投票,那么这就是要走的路。您还可以查看服务器发送的事件,这比 websockets 和 comet(长轮询)更简单。有一个烧瓶示例 sn-p here 可能提供一些指针。