如何解决通过Redis队列冲刺长任务
我想在Dash中构建一个Web应用程序,该应用程序对用户输入的数据执行计算量大的任务,并以表格格式返回结果。 在前端,我有一个Dash回调,该回调根据Dash组件的输入来更新Dash组件,例如:
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约定在处理过程中结果为None),我将其返回给客户端。问题是我的部署平台不允许前端作业运行太长时间。因此,即使我将作业发送到后端,我也必须找到一种方法,使Dash应用程序侦听变量df上的所有更新。
我确定该解决方案可以在某个地方访问,但是我实在是个新手,找不到它。很高兴指出一些可以找到解决方法的文档。
解决方法
我认为您正在寻找Interval
组件(文档here)。它会定期触发客户端更新,例如每秒一次。回调将遵循
...
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。