我已将长时间运行的任务分段为逻辑子任务,因此我可以在完成时报告每个子任务的结果.但是,我正在尝试报告一个有效永远无法完成的任务的结果(而不是随着时间的推移产生值),并且我正在努力使用现有的解决方案.
我正在为我编写的一些Python程序构建一个Web界面.用户可以通过Web表单提交作业,然后回来查看作业的进度.
假设我有两个函数,每个函数都通过不同的形式访问:
med_func:执行约1分钟,结果传递给render(),产生额外的数据.long_func:返回一个生成器.每个yield大约30分钟,应该报告给用户.收益率如此之多,我们可以将此迭代器视为无限(仅在撤销时终止).有med_func,我报告结果如下:
在表单提交上,我保存AsyncResult到Django会话:
task_result = med_func.apply_async([form], link=render.s())
request.session["task_result"] = task_result
Run Code Online (Sandbox Code Playgroud)
结果页面的Django视图访问它AsyncResult.任务完成后,结果将保存到作为上下文传递给Django模板的对象中.
def results(request):
""" Serve (possibly incomplete) results of a session's latest run. """
session = request.session
try: # Load most recent task
task_result = session["task_result"]
except KeyError: # Already cleared, or doesn't exist
if "results" not in session:
session["status"] = "No job submitted"
else: # Extract …Run Code Online (Sandbox Code Playgroud)