关于异步的问题!

bios8086 2011-08-15 06:31:02
这个概念还是有点模糊,书上说对于密集的I/O操作 异步的效率比同步要高很多,比如下载网页,使用异步操作好在哪里呢?
异步的httpwebrequest不是仍然需要等待吗?"一个常见的做法就是执行一系列的I/O密集操作,同时对其结果进行操作" 这是
《Effective C#》里的一句话,我就是不是很明白,结果还在异步执行呢,怎就就对其结果进行操作了?
...全文
389 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeeHGMaster 2012-12-24
  • 打赏
  • 举报
回复
复于: 2011-08-16 17:25:00 假设一个足球场,10个人提水从一端到另一端,第一种方式是没人提一桶水走过去,第二种方式是十个人等分的站成一线,一桶一桶传递过去,问哪种方式快? 且算着呢吧,告诉你是第二种方式快,因为第一种方式10个人把水送过去后,都要走回来,这段时间是不做功的,而逐个传送的方式每个人走的距离只有第一种的十分之一,而且“传送带”上可以同时传递多桶水。回过头在想想异步模式,是不是有些类似呢?
showjim 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 etudiant6666 的回复:]
异步模式的绝大部分应用都属于“流水线”形式。
[/Quote]
顶楼上,从本质上说,异步的目标就是流水线。
窗户纸 2011-08-17
  • 打赏
  • 举报
回复
异步模式的绝大部分应用都属于“流水线”形式。
窗户纸 2011-08-17
  • 打赏
  • 举报
回复
再从水桶角度说几句,如果我们把水桶理解为线程,如果我们只有10个水桶,那么都传出去后,第一个人手里没有水桶了就会空闲(线程池空了),因此异步模式要求对线程的获取有支配权,保证他可以不断拿到新水桶,以不至于因为水桶没有而停工。
那么,如果这是个人中有个人动作很慢,结果会怎么样呢,他的面前会堆积很多水桶,这对应程序就是很多线程被阻塞到他那里了,解决的方法就是在他那安个水槽(队列),传过来时将水倒入水槽中就可以了。因此异步模式往往要和队列紧密联系,不然反而会造成线程资源的大幅占用。很多服务器端没有注意这一点,就造成了未知的系统很慢的问题。
窗户纸 2011-08-17
  • 打赏
  • 举报
回复
再往多说两句,假设对于第二种(传水桶)的方式,要求收到空桶后才能回去领水,那会是什么效果,很明显,这是个人排队干的事只有第一种的十分之一的效率。和人家一次传一桶的效率相同,很多牛x的架构师设计的异步模式就是这种“伪异步”,每次发出异步请求后等到回调才开始下一次操作。其节省的只不过是线程资源而已,并没有起到提高效率的目的,
高效的异步可以起到比10个水桶(并发模式)一起出发更高的效率,而不是更低。这就要求传水桶的人传到目的地后要马上放下水桶开始新的传水桶作业。
  • 打赏
  • 举报
回复
顶LS的几位,异步线程是相对应用程序主线程(通常是UI线程)来说的,回调函数(委托)会在异步线程完成下载时主动给主线程发送一个消息,而不是让主线程一直阻塞,等待下载完成后再继续往下执行,有效地避免应用程序假死,并提高了效率(并发执行了多件事件)
窗户纸 2011-08-16
  • 打赏
  • 举报
回复
为什么并行总线要被串行总线替代,就是一样的比喻
窗户纸 2011-08-16
  • 打赏
  • 举报
回复
我的例子实际上是并发与串行的例子,但解决的问题是一样的,10个人周而复始的担水,诸位可以实际试试哪种快,其关键点余异步模式相同的是“减少CPU空闲的时间”,1-个人都从球场一端走回到另一端,期间就造成了10个人都是空闲的,而传递的方式时,每人异步的操作,空闲时间只有其1/10
ycproc 2011-08-16
  • 打赏
  • 举报
回复
Linux® 中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O 请求可能需要与其他进程产生交叠
  • 打赏
  • 举报
回复
再说一下为什么CPU利用率很低?因为大量时间都花在等待底层各种设备的响应上了!

这就是需要异步编程的原因。特别是现在的CPU多核心的越来越多,速度已经达到极限的情况下就是通过提高并发率来提高整个系统执行速度。异步编程会成为以后一个非常基本的编程知识,否则你的程序可能根本禁不起随便的code review就淘汰了。
  • 打赏
  • 举报
回复
“十个人提水”一趟就搞定了,还“走回来”干什么?
  • 打赏
  • 举报
回复
什么乱七八糟的。

唉,并发是为了什么?为了把CPU利用率提高。

比如下载时你的CPU可能有那么几秒钟只有2%,如果你有一大批文件需要下载,那么就是多个连续的2%,因为它们是顺序执行的。

而并发时你就能能把CPU利用率提高到40%,虽然单个下载慢了,但是整个速度快了,因为它们是并发执行的。
bios8086 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 skyparty 的回复:]

引用 4 楼 etudiant6666 的回复:

假设一个足球场,10个人提水从一端到另一端,第一种方式是没人提一桶水走过去,第二种方式是十个人等分的站成一线,一桶一桶传递过去,问哪种方式快?
且算着呢吧,告诉你是第二种方式快,因为第一种方式10个人把水送过去后,都要走回来,这段时间是不做功的,而逐个传送的方式每个人走的距离只有第一种的十分之一,而且“传送带”上可以同时传递多桶水。回过头……
[/Quote]
恩 较接近事实了!
nicholesvb 2011-08-16
  • 打赏
  • 举报
回复
强大 如题
hui_play 2011-08-16
  • 打赏
  • 举报
回复
似懂非懂
小赖赖 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 etudiant6666 的回复:]

假设一个足球场,10个人提水从一端到另一端,第一种方式是没人提一桶水走过去,第二种方式是十个人等分的站成一线,一桶一桶传递过去,问哪种方式快?
且算着呢吧,告诉你是第二种方式快,因为第一种方式10个人把水送过去后,都要走回来,这段时间是不做功的,而逐个传送的方式每个人走的距离只有第一种的十分之一,而且“传送带”上可以同时传递多桶水。回过头在想想异步模式,是不是有些类似呢?
[/Quote]
这个是一样快吧
第二种方式也要走回来
第一种方式一次送10桶,第二种方式一次一桶,走的距离当然是十分之一了
这例子不恰当啊....

异步其实是一种统筹安排,
比如做饭的时候,有2种方式
一种是把菜全部准备好,然后煮菜
一种是准备一份菜,煮一份,煮的时候可以不用管,再去准备下一份菜
假设准备一份菜的时间是1,煮菜的时间是2
做10份菜用第一种方式需要30单位的时间
第二种方式只需要21单位的时间
bios8086 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 etudiant6666 的回复:]

假设一个足球场,10个人提水从一端到另一端,第一种方式是没人提一桶水走过去,第二种方式是十个人等分的站成一线,一桶一桶传递过去,问哪种方式快?
且算着呢吧,告诉你是第二种方式快,因为第一种方式10个人把水送过去后,都要走回来,这段时间是不做功的,而逐个传送的方式每个人走的距离只有第一种的十分之一,而且“传送带”上可以同时传递多桶水。回过头在想想异步模式,是不是有些类似呢?
[/Quote]
豁然开朗
窗户纸 2011-08-16
  • 打赏
  • 举报
回复
假设一个足球场,10个人提水从一端到另一端,第一种方式是没人提一桶水走过去,第二种方式是十个人等分的站成一线,一桶一桶传递过去,问哪种方式快?
且算着呢吧,告诉你是第二种方式快,因为第一种方式10个人把水送过去后,都要走回来,这段时间是不做功的,而逐个传送的方式每个人走的距离只有第一种的十分之一,而且“传送带”上可以同时传递多桶水。回过头在想想异步模式,是不是有些类似呢?
bios8086 2011-08-16
  • 打赏
  • 举报
回复
顶起!
bios8086 2011-08-15
  • 打赏
  • 举报
回复
莫非是书的作者把这个夸大了?我真的想不出异步好在哪里,其实也就是新增了个线程,负责下载啊
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧