gpt4 book ai didi

playframework - 在 Play 框架中,何时使用 Promise 来处理请求,何时不使用?

转载 作者:行者123 更新时间:2023-12-04 15:23:36 24 4
gpt4 key购买 nike

我是 Play 新手据我所知,这可能是错误的,play 框架通过以异步方式处理请求是非阻塞的,应该使用 Promise 异步完成长时间阻塞操作。那么我什么时候应该使用 promise 或映射 promise 来处理给定的请求,什么时候不呢?

例如,假设用户上传文件,当它到达 Controller 时,我将文件从临时文件夹移动到所需文件夹并插入数据库记录。所以这涉及2个阻塞操作,文件移动和插入数据库。假设文件不大,比如最大 10MB,所以文件移动应该相当快。并且使用阻塞数据库驱动程序插入数据库记录也应该很快。

在这种简单的情况下,我应该使用一个 promise / future 来执行 2 个操作或 2 个映射的 promise (移动文件然后插入 db 记录)还是根本不使用 promise ?为什么?

请分享您的想法/经验。
先感谢您。

最佳答案

这实际上是一条很好的路线,决定什么进入 future ,什么最终不依赖于应用程序。

一般来说,您不必担心将来会调用数据库。由于底层驱动程序正在阻塞,您将在某处阻塞,即使您将其放在 future 或 actor 中。所以:尝试减少数据库延迟。确保您的数据库就在附近(网络拓扑上)并且有足够的资源。

以非阻塞方式移动文件可以通过以下方式轻松处理:

def uploadFile() = Action {
Async {
// handle file moving
Ok
}
}

但是,假设您仍然有两个与文件有关的昂贵的事情。如果一个 Action 依赖于另一个 Action ,那么您可以随意组织它(在一个 Future 中非常好)。在开始第二个任务之前,您必须完成第一个任务。然而,代码可能是最干净的,使用两个 future 。高水平,例如:

for { movedFile <- moveFile(file)
analyzedFile <- analyzeFile(movedFile) } yield analyzedFile

对我来说似乎很干净。但是不要觉得你必须把每一个微小的 Action 分解成它自己的 future 。

但是,如果您有两个可以独立运行的任务,那么您当然可以使用两个 future 同时进行。

关于playframework - 在 Play 框架中,何时使用 Promise 来处理请求,何时不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18055255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com