多线程和异步的区别

许多人被教导多线程和异步是同一回事,但事实并非如此。

类比通常会有所帮助。您在餐厅做饭。订购鸡蛋和吐司。

  • 同步:先煮鸡蛋,再煮吐司。
  • 异步单线程:开始煮鸡蛋并设置计时器。您开始烤面包,并设置一个计时器。他们俩都在做饭时,您要打扫厨房。计时器关闭后,您将鸡蛋和干面包从烤面包机中取出并送达。
  • 异步,多线程:您再雇用两名厨师,一名厨师煮鸡蛋,一名厨师烤面包。现在您需要协调厨师,以便他们在共享资源时不会在厨房互相冲突。而且你必须付钱。

现在,多线程仅仅是异步的一种有意义吗? 线程是关于工人的。
异步是关于任务的
。在多线程工作流中,您将任务分配给工作人员。在异步单线程工作流中,您可以看到一个任务图,其中某些任务取决于其他任务的结果。在每个任务完成时,给定刚完成的任务的结果,它将调用计划下一个可以运行的任务的代码。但是您(希望)仅需要一名工作人员即可执行所有任务,而不需要每个任务一名工作人员。

这将有助于认识到许多任务不是处理器约束的。对于与处理器相关的任务,合理的做法是雇用与处理器数量一样多的工作程序(线程),为每个工作程序分配一个任务,为每个工作程序分配一个处理器,让每个处理器除了计算结果外,不做其他任何事情尽快。但是对于没有在处理器上等待的任务,您根本不需要分配工作器。您只需要等待消息到达就可以得到结果,然后
在等待时执行其他操作即可 。当该消息到达时,您可以将已完成任务的继续安排为待办事项列表上的下一件事,以进行核对。

因此,让我们更详细地看一下乔恩的例子。怎么了?

  • 有人调用DisplayWebSiteLength。WHO?我们不在乎。
  • 它设置一个标签,创建一个客户端,并要求客户端获取一些东西。客户端返回一个对象,该对象表示获取某些内容的任务。该任务正在进行中。
  • 它在另一个线程上进行吗?可能不是。阅读Stephen的文章,了解为什么没有线程。
  • 现在我们等待任务。怎么了?我们检查任务在创建和等待之间是否完成。如果是,那么我们获取结果并继续运行。让我们假设它还没有完成。 我们将该方法的其余部分签名为该任务的继续并返回 。
  • 现在,控制权已返回给调用者。它有什么作用?无论它想要什么。
  • 现在,假设任务已完成。它是怎么做到的?也许它正在另一个线程上运行,或者也许我们刚刚返回的调用方允许它在当前线程上运行完成。无论如何,我们现在有一个完成的任务。
  • 完成的任务要求正确的线程(可能是 唯一的 线程)再次运行任务。
  • 控制权立即返回到我们刚刚在等待点离开的方法。现在有  一个结果,以便我们可以分配text和运行方法的其余部分。

就像我的类比。有人要求您提供文件。您发送了该文档的邮件,并继续进行其他工作。当它到达邮件中时,您会收到信号通知,并且当您感到喜欢时,就完成了其余的工作流程-
打开信封,支付邮寄费,无论如何。您无需雇用其他工人即可为您完成所有这些工作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值