Heroku 通过redis队列完成超长任务
我想在Dash中构建一个web应用程序,在用户输入的数据上执行一个计算代价高昂的任务,并以表格格式返回结果。 在前端,我有一个仪表板回调,它根据仪表板组件的输入更新仪表板组件,例如:Heroku 通过redis队列完成超长任务,heroku,redis,gunicorn,plotly-dash,Heroku,Redis,Gunicorn,Plotly Dash,我想在Dash中构建一个web应用程序,在用户输入的数据上执行一个计算代价高昂的任务,并以表格格式返回结果。 在前端,我有一个仪表板回调,它根据仪表板组件的输入更新仪表板组件,例如: from rq import Queue from worker import conn import time # redis connection to execute tasks in the background q = Queue(connection=conn,job_timeout='3m') @a
from rq import Queue
from worker import conn
import time
# redis connection to execute tasks in the background
q = Queue(connection=conn,job_timeout='3m')
@app.callback(
[Output('table-columns', 'columns'),
Output('table-columns', 'data'),],
[Input('upload', 'contents'),
Input('launch-expensive-job-button', 'n_clicks')],
)
def expensive_task(contents, n_clicks_launch):
df = q.enqueue(expensive_function, contents).result
while df is None:
time.sleep(2)
return [{"name": i, "id": i} for i in df.columns], df.to_dict("rows")
我正在使用Redis队列在后台运行任务。一旦df变量中的结果被更新(处理期间Redis约定为result None),我就将其返回给客户机。问题是我的部署平台不允许前端作业运行太长时间。因此,即使我将作业发送到后端,我也必须找到一种方法让Dash应用程序监听变量df的任何更新
我确信这个解决方案是可以找到的,但我是个新手,找不到它。很高兴有人指给我看一些我可以找到的文档。我想您正在寻找
Interval
组件(文档)。它会定期触发客户端更新,例如每秒一次。回调将沿着以下路线进行:
...
Interval(id='trigger', interval=1000) # must be in the app layout
...
@app.callback(Output(...), [Input('trigger', 'n_intervals')])
def poll_update(n_intervals):
# check status of redis here and update the output accordingly
我想您正在寻找
Interval
组件(文档)。它会定期触发客户端更新,例如每秒一次。回调将沿着以下路线进行:
...
Interval(id='trigger', interval=1000) # must be in the app layout
...
@app.callback(Output(...), [Input('trigger', 'n_intervals')])
def poll_update(n_intervals):
# check status of redis here and update the output accordingly
感谢您的回答,
Interval
组件无疑是一个不错的选择。接下来,除了使变量成为全局变量外,您是否可以建议一种方法,使带有Interval
组件的回调侦听来自df变量的更新?我目前仍然必须在本地存储df,因为它是一个相当大的数据集,所以如果我能够将它直接传输到回调,那就太好了。非常感谢!感谢您的回答,Interval
组件无疑是一个不错的选择。接下来,除了使变量成为全局变量外,您是否可以建议一种方法,使带有Interval
组件的回调侦听来自df变量的更新?我目前仍然必须在本地存储df,因为它是一个相当大的数据集,所以如果我能够将它直接传输到回调,那就太好了。非常感谢!