为什么服务器操作不能并发执行?

Why are Server Actions not executing concurrently?

提问人:acupoftea 提问时间:11/15/2023 最后编辑:acupoftea 更新时间:11/23/2023 访问量:130

问:

这个赏金已经结束了。这个问题的答案有资格获得 +50 声望赏金。赏金宽限期在 20 小时后结束。acupoftea希望引起人们对这个问题的更多关注

请考虑以下功能:

async function printAB() {
  console.log("A");
  await new Promise((resolve) => setTimeout(resolve, 1000));
  console.log("B");
}

async function f() {
  printAB();
  printAB();
}

通常的预期输出将是f()

A
A
B
B

因为这些语句可以与超时同时执行。事实上,如果函数既在服务器上(操作或在服务器组件中定义),要么同时在客户端上,我们就会得到这样的结果。但是,如果是服务器操作,并且是用户组件中的函数,则我们得到console.log('A')printABf

A
B
A
B

.为什么会这样?如果我们一次使用多个操作,这种行为可能会导致性能下降,有没有办法避免它?

JavaScript 下一个 .js 服务器操作

评论

0赞 code 11/15/2023
如果所有三个函数都在服务器上运行,我无法重现。
0赞 acupoftea 11/15/2023
@code确认,如果是服务器操作,您仍然得到?在这种情况下,我只是仔细检查了一下。fABCACB
0赞 code 11/15/2023
我得到了.A C B
0赞 acupoftea 11/15/2023
@code对,您似乎已经复制了所述行为。我的问题是什么时候是客户端,其他人是服务器,然后是,我不明白为什么。fA B C
0赞 acupoftea 11/17/2023
注意:为了提高可读性,从 VS 更改为 VSA C BA B CA A B BA B A B

答:

0赞 acupoftea 11/18/2023 #1

来自 react.dev“使用服务器”文档(强调我的):

服务器操作专为更新服务器端状态的突变而设计;不建议将它们用于数据获取。因此,实现服务器操作的框架通常一次处理一个操作,并且没有办法缓存返回值。

我仍然不明白为什么,以及它是如何详细工作的。这是在服务器端完成的吗?这是否意味着如果有很多用户,他们不会被例如.DB写入并行服务?

1赞 elcharitas 11/23/2023 #2

顶级域名;如果需要处理多个操作,请创建一个服务器操作来执行此操作。避免在客户端代码中按顺序调用多个服务器操作。

从 react.dev 的文档中,我们有两条信息可以更清楚地说明 OP 的问题:

  1. 服务器操作的常见注意事项

服务器操作专为更新服务器端状态的突变而设计

  1. 有关在客户端代码中使用服务器操作的信息

服务器操作是公开的服务器终结点,可以在客户端代码中的任何位置调用。

这些告诉我们一件事,与 OP 可能想要查看它的方式相反,当通过客户端触发时,每个调用都被视为一个单独的 API 调用。这意味着作为函数的执行发生在服务器上,而不是在客户端上,因此,您不能期望在客户端上执行函数时获得相同的结果。printABprintAB

因此,触发多个只会导致调用服务器端点,当这种情况发生时,我们会得到结果,OP包括如下,但包含更多信息:printAB

// f is a client code
function f(){
printAB()
printAB()
}
...
// two requests are made, since f is client code

// 1st request
A (from first printAB)
B (from first printAB)
//timeout is invoked.

// 2nd request
A (from second printAB)
B (from second printAB)
//timeout is invoked.

最后的话?我想说的是,查看服务器操作的一种方法是将您创建的每个服务器操作视为某种 API 端点,并且每个突变仅触发一个操作,虽然这是可能且允许的,但请避免多个操作调用,正如您在问题中概述的那样。

评论

0赞 acupoftea 11/23/2023
我知道它基本上是 API 的糖语法,但 API 实际上可以同时处理事情,对吧?所以我仍然不明白为什么服务器操作没有
0赞 elcharitas 11/23/2023
是的,API 可以并发处理。但是,并发并不意味着同时调用处理程序(在本例中为 printAB)。相反,并发意味着两个任务(printAB)可以同时进行,并且系统管理它们的执行。然后,执行顺序由请求之间的时间、网络延迟等确定