多线程和异步的区别

首先,多线程和异步编程不是一个概念
可以用如下比喻:
情景:你是一个饭店的厨师,有个订单过来了,要蒸鸡蛋和烤面包
同步:先做蒸鸡蛋,(哪怕是鸡蛋在蒸的时候没事干也不去烤面包,而是在干等),做完了蒸鸡蛋再去烤面包
异步:1.单线程 先做蒸鸡蛋,鸡蛋在蒸的时候,定好闹钟,然后去烤面包,面包在烤的过程中,也定个闹钟,当鸡蛋闹钟响起来的时候,不管是不是在给面包切片还是在等待面包烤熟,都去处理鸡蛋(如把鸡蛋从锅里端上来,送给客人),然后再回来处理烤面包,面包在烤的过程中可以打扫厨房,等烤面包的闹钟响起的时候,再去处理烤面包(如:送给客人)
2.多线程 请两个厨师给你打下手,一个去蒸鸡蛋,一个去烤面包,你做的主要的事情就是协调他们对物品的使用先后顺序,不要让他们因为抢一件东西(比如调料)而打起来(多线程的资源共享问题)。当然,请厨师是要付钱的(多线程的性能损耗)。

对于计算限制的任务,比较好的做法是多请几个厨师(多开几个线程),线程数最好和处理器数一样,为每个任务分配一个线程,为每个线程分配一个单独的处理器(避免上下文切换),然后每个处理器去处理任务,这会加快任务的处理速度。
但是对于非计算限制的任务,多线程处理在线程处理方面意义就不大了,只要使用单线程的task即可。
分为IO限制和计算限制
IO限制指用于数据传输上的数据等待,本身消耗计算量不大,重要事情不是程序完成的。如console.readkey() 网络数据下载
计算限制的是需要执行大量计算的操作

Task的主要作用是不堵塞主线程,构建响应灵敏的程序,不一定会开辟多个线程。而多线程一定是开辟多个线程并发执行的。
Thumb rule is to use threads for CPU bound operation and async for IO bound operation for a client application. Always use async for a server application.
推荐原则是:
对于客户端应用程序:用多线程方式处理计算限制的操作,用task处理IO限制的操作
对于服务器应用程序:始终用Task

To quote the Tomes of Knowledge, “Regardless of the type of I/O request, internally I/O operations issued to a driver on behalf of the application are performed asynchronously”.

Task中再遇到Await后,方法立即返回,不会因为await关键字而阻塞当前线程,当await关键字标记的语句执行完成后才会继续执行await后面的语句。
Task会中断方法的执行,但是不会阻塞线程,用其余的cpu片段处理别的任务。
但是锁会阻塞方法所在的线程,造成活锁(基元用户模式构造造成)

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值