如何在 Actix Web 中对长时间运行的任务提供网页反馈?

How can one give webpage feedback on a long running task in Actix web?

提问人:martinkooij4 提问时间:11/15/2023 最后编辑:martinkooij4 更新时间:11/15/2023 访问量:36

问:

我可能错过了它,但我找不到如何在 actix_web 中长时间运行的任务期间在网页上向用户提供反馈。程序是用 Rust 编写的。

摘要:我在“/calculate”上有一个进行长计算的路由。我现在有一个异步函数async fn calculate(webdata,identity,..)-> impl Responder {........HttpResponse::Ok().body(“Done result = xxxyxyxyy”},作为处理程序放在 App 的路由中。

这适用于简短的计算。对于长时间的计算,我可以看到我可以选择阻止网页,直到我得到结果,或者立即做出响应并将结果丢失到巨大的银河系虚空中(或者正如我在一些例子中发现的那样:进入println!终端;-))。

实际上,对于长时间的计算,我想在用户导航到“/calculate”时执行以下模式。

  1. 显示“工作.....”作为 HttpResponse

  2. 进行计算

  3. 显示“完成。result = xxxyxyxyxyx“作为 HttpResponse

我知道 web:block 和 web:spawn,但它们对于保护计算很有用,但我仍然只能设法从处理程序给出一个响应。我知道如何在更大的前端框架中做到这一点,例如 react,甚至可能是 yew,但我只是好奇我是否只在 actix_web 中缺少一种明显的方法来做到这一点。

注1:在我的应用程序中,它实际上不是一个计算,而是一组更复杂的操作。此外,实际的反应更加花哨和丰富多彩。

注意2:如果设置是这样的,我也可以有一个“停止”按钮来停止计算,那将是理想的。但这是下一步。

Rust 用户体验 actix-web 长时间运行任务

评论

0赞 user2407038 11/15/2023
根据我的理解,actix_web是一个服务器框架,而不是前端框架。所有“前端框架”(例如 react)执行此操作的方式基本上归结为使用 HTML 页面响应的路由,其中包含 javascript,该页面立即调用另一个名为 当第二个请求完成时,更新 HTML 内容。由于 actix_web 不是前端框架,因此它对如何使用 actix_web 来执行此过程没有意见。你需要“另一个”框架,或者推出你自己的框架。calculatecalc_rest
0赞 erny 11/15/2023
长时间运行的任务始终是 Web 编程中的一个挑战,请求/响应周期通常不是很方便,因为它可能会超时。您可能对以下解决方案感兴趣:使用具有后台作业的队列。您将任务排入队列并获取作业 ID,然后您可以 a) 如果作业完成(例如,vía 定期 ajax 请求)并显示结果,或者 b) 使用 websockets 并在结果可用时向客户端(浏览器页面)发送消息。
0赞 martinkooij4 11/16/2023
谢谢。将采用react或yew作为前端框架。两者都很容易做到,但希望我会错过一些明显的服务器框架模式。
0赞 Njuguna Mureithi 11/18/2023
您是否考虑过使用上交所?
0赞 martinkooij4 11/20/2023
我现在决定通过以最简单的形式使用前端 vuejs 来解决这个问题(一个内联 html 组件,用于处理等待并显示漂亮的等待图形、它们进来时的结果和取消按钮)。actix 服务器端仍然以纯粹的请求/响应模式完成所有艰苦的工作。作为一种魅力。感谢社区帮助我不要陷入试图让 actix 服务器框架做一些行不通的事情。

答: 暂无答案