通过redis队列执行长任务

dfddblmv  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(300)

我想在dash中构建一个web应用程序,在用户输入的数据上执行一个计算开销很大的任务,并以表格格式返回结果。在前端,我有一个 Jmeter 板回调,它根据 Jmeter 板组件的输入更新 Jmeter 板组件,例如:

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的任何更新。
我确信这个解决方案是可行的,但我是一个新手,找不到它。很高兴有人指出一些文件,我可以找到我的方式。

klh5stk1

klh5stk11#

我想你在找 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

相关问题