首页 新闻 会员 周边

想问一下 请求.net core webapi 的请求线程 是特殊的吗 相比task.run()的线程

0
悬赏园豆:10 [已解决问题] 解决于 2019-12-04 23:33

想问一下 请求.net core webapi 的请求线程 是特殊的吗 相比task.run()的线程

narojay的主页 narojay | 初学一级 | 园豆:3
提问于:2019-12-04 14:29
< >
分享
最佳答案
1

不是特殊的,都是池子(线程池)里的

收获园豆:10
dudu | 高人七级 |园豆:30979 | 2019-12-04 14:31

谢谢dudu,
对于异步可以提高并发量 webapi 请求线程 到await 释放webapi 线程 ,操作等待,如果 await里面task.run线程 ,虽然 webapi请求线程释放了,但是await 又创建了线程 ,这样如何提高了并发量 ,如果异步方法不创建线程我理解,可以提高并发量。 我在博客园 很多大哥博客里面 看到 webapi请求线程是特殊的线程池 ,异步方法里面如果使用线程是廉价的线程。。

narojay | 园豆:3 (初学一级) | 2019-12-04 14:42

希望dudu可以解答

narojay | 园豆:3 (初学一级) | 2019-12-04 14:42

@narojay: await 的作用是释放当前线程

dudu | 园豆:30979 (高人七级) | 2019-12-04 14:43

@dudu: 对 我明白释放的是当前线程 但是如果异步方法创建了线程 线程池的线程不是也会减少吗?

narojay | 园豆:3 (初学一级) | 2019-12-04 14:44
dudu | 园豆:30979 (高人七级) | 2019-12-04 14:45

@dudu: 这个链接是这个博问.

narojay | 园豆:3 (初学一级) | 2019-12-04 14:46

@narojay: 除非你在异步方法使用 Task.Run 这样的方法专门使用了新的线程,否则异步方法并不会创建线程

dudu | 园豆:30979 (高人七级) | 2019-12-04 14:48

@narojay: 已修正了链接

dudu | 园豆:30979 (高人七级) | 2019-12-04 14:49

@dudu: 如果我在异步里面创建线程 是否会影响异步提高并发量的作用

narojay | 园豆:3 (初学一级) | 2019-12-04 14:50

@narojay: 会消耗更多的线程,对系统的并发吞吐量有影响

dudu | 园豆:30979 (高人七级) | 2019-12-04 14:53

@dudu: 明白了 ,那么这几个博客园的大哥博客有点 问题 请求webapi并不是在特殊的线程池里面。

narojay | 园豆:3 (初学一级) | 2019-12-04 14:56

感谢两位

narojay | 园豆:3 (初学一级) | 2019-12-04 15:15
其他回答(1)
1

换个例子,1个请求到你的api,消耗掉线程池1个线程,请求到达 await File.ReadAsync(). 这个时候要等待IO的完成,这里的IO指得是系统api走硬件到磁盘的IO,那遇到await后,请求会把这个线程返回给你的应用程序线程池(线程池所有线程都空闲了)。等IO完成后,在从线程池拿一个线程继续后续的步骤。

在这个等待的过程中就不需要占着一个线程不用浪费了对不。

上面说的IO可以是文件IO,网络IO等都是一个道理。

假设你的代码是类似下面的,那await毫无意义。
Api:
await yourTask();

Task yourTask(){while(true){//3秒后退出}}

czd890 | 园豆:14412 (专家六级) | 2019-12-04 14:51

对 我理解io那种情况,那种异步不会创建线程 api线程直接返回 ,可以提高并发量,
那么是否可以说如果异步创建了线程 并不会提高并发量。不是io情况的话。

支持(0) 反对(0) narojay | 园豆:3 (初学一级) | 2019-12-04 14:55

@narojay: 是的,而且会降低性能,因为线程的上下文切换也是有代价的。

yourTask();
yourTask(){while(true){//循环3秒后退出}}

上面这个比下面这个性能更好。少了一次线程的切换。

await yourTaskAsync();
Task yourTaskAsync(){while(true){//循环3秒后退出}}

支持(0) 反对(0) czd890 | 园豆:14412 (专家六级) | 2019-12-04 15:10

如果你要测试,可以考虑

await yourTaskAsync();
Task yourTaskAsync(){
    await Task.Yield();//切换线程
    var sw = Stopwatch.Start()
    while(sw.total> 3){}

//Or Task.Run(()=>{})
}
支持(0) 反对(0) czd890 | 园豆:14412 (专家六级) | 2019-12-04 15:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册