Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku 通过redis队列完成超长任务_Heroku_Redis_Gunicorn_Plotly Dash - Fatal编程技术网

Heroku 通过redis队列完成超长任务

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

我想在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')
@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,因为它是一个相当大的数据集,所以如果我能够将它直接传输到回调,那就太好了。非常感谢!