gpt4 book ai didi

c# - .Net Core Web Api 异步不重要吗?

转载 作者:太空狗 更新时间:2023-10-30 00:17:58 24 4
gpt4 key购买 nike

我一直在使用 async 关键字编写我的 Web Api Controller 方法,并且一直在使用 async 。我最近尝试进行方法同步以查看它会如何影响性能,并且震惊地发现它对任何其他 http 请求都没有阻塞影响。

举个例子-

[Route("Foo")]
class FooController {
[HttpGet("Hello")]
public string GetHello()
{
Thread.Sleep(100000); // 100 seconds
return "Hello";
}

[HttpGet("Goodbye")]
public string GetGoodbye()
{
return "Goodbye";
}
}

有了这个我可以运行 GET => /Foo/Hello 然后是任意数量的 GET => /Foo/再见,我对 Goodbye 端点的请求没有被阻止。

我最初认为我需要使 Hello 方法异步,以便对 Goodbye 端点的请求将立即返回。但是让这个方法同步/异步没有效果!

很迷茫。 Web Api 应用程序不需要异步吗?为什么推荐?

最佳答案

没那么简单。

有一种叫做线程池的东西。对您的应用程序的每个请求都会分配给从线程池中获取的单独线程。这是一个请求不会阻止另一个请求的第一个原因。

现在,当您的流量较低时,一切都很好,因此您不会达到线程池中线程数的限制。但是……

为了便于讨论,假设您的请求平均需要 1 秒,并且您的线程池大小为 100。您将在第 101 个请求时开始遇到限制。那个,因为它没有分配给它的线程池,将不得不等待第 100 个请求完成,将线程释放回线程池,然后它才能得到处理。

现在,根据您的请求,异步可以提供帮助(但也可能导致问题,所以不要盲目使用它!):

  1. 如果您的请求执行 I/O 操作(网络调用、文件系统、数据库异步等),那么这些操作将在 I/O 线程上运行。那些不是来自线程池。因此,想象一个请求进入并触发网络调用或文件读取需要 0.93 秒。这实际上意味着,如果你不使用异步,你的线程池线程在 0.93 秒内没有用,它只是坐在那里等待 IO 线程完成。在这些情况下,async 会非常有用,因为一旦它遇到 await 关键字(用于使用 IO 线程的操作),它就会从线程池中释放线程立即,以便可以满足下一个请求。一旦IO操作完成,它会从线程池中获取一个线程来服务于响应。

  2. 如果您的请求不使用任何 IO 操作,但您强制它们使用异步(有办法做到这一点),那么您将有效地做的就是交换一个线程池线程(最初用于接受请求)为另一个请求(这将使操作运行)。在这种情况下,您只会产生开销并降低性能。

但是,无论如何,我觉得这与您的问题并不严格相关。在上述两种情况中的任何一种情况下,您的方法都在 2 个单独的请求中运行,与 async/await 几乎没有任何关系,但与独立处理请求的服务器环境有关。

关于c# - .Net Core Web Api 异步不重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47760065/

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