并发、并行和异步

1、 并行和并发

(1)并发

一定周期内,多个任务来回切换执行,宏观上形成 “该周期内有多个任务在同时进行”;但同一时间点只有一个任务在执行。

举例:
你想在2小时内同时完成做饭、扫地、烧水。但家里就你一个人,你根据操作难易排了下顺序,所以就先把电茶壶接满水开始烧。接着你就做饭,做饭中,有个菜需要炖半个小时,这个时候你发现电茶壶的水还没烧开,所以你就赶快又去扫地。等地扫完了,你发现水烧开了且菜还在炖,你就把水倒进了暖瓶。倒完接着做饭。
这样,所有任务完成的最终时间 同时受多任务之间的协调快慢、任务各自的完成时间限制。比如本来单独执行任一个任务:做饭70分钟、扫地20分钟、烧水15分钟,但是并发中可能出现水烧好了,菜也炖好了。你为了不让菜炖的太烂,就选择先把菜盛起来(资源抢占,做饭抢到了资源,倒水就还得继续等待下一次资源释放),这样“水被导入暖瓶”的时间就被推后。

总体就是:一个主体在同一周期(2小时)内同时开启多个线程,每个线程做1个任务,但同一时间点只有一个线程(也即一个任务)在做。

(2)并行

同一时间点多个任务同时进行

举例:家里有多个人。还是想在2小时内同时完成做饭、扫地、烧水。你就说A你来扫地,B你来烧水,C你来做饭。这样A,B,C就并行执行任务了!
这样,所有任务完成的最终时间 由 任务做的最慢的那条线决定。也就是最终只需要70分钟!

总体就是:多个主体(A,B,C)各自领取线程,在时间执行上互不影响,不需要等待一方释放资源。同一时间点多个任务在做!

(3)异步

文章:Python异步和多线程区别
异步:单线程下完成多个任务切换。

异步的特点:

  • 在单个线程中使用异步IO,会大大提高cpu的使用率(异步I/O可以有效地解决I/O密集型任务中的阻塞问题,提高程序的并发性能)。
  • 协程间是协同调度的,这使得并发量数万以上的时候,协程的性能是远远线程
  • 虽然是单线程,但由于异步的存在,异步IO不能保证全局变量成员变量安全

举例:
工人-cpu核,衣服-线程,做饭、扫地、烧水-任务。

  • 多线程并发模型中,每个线程可以看作是同一工人拥有的不同工作服,虽然在同一时间段内他可以换上不同的工作服进行做饭、扫地、烧水这些任务,但在任何特定的时间点,他只能执行一项任务。比如他在做饭的同时还要扫地,那他必须停下来,换上扫地的工作服,然后扫地。“换衣服”就是在做线程的上下文切换,会消耗一定的时间。
  • 异步I/O(或事件驱动)模型中,可以看做虽然这个工人他拥有多套工作服(多个线程),但是他的每套工作服都是万能的。比如他在做饭、扫地、烧水时只需穿其中一套万能工作服即可,不用再每次切换任务都要换工作服(即在单线程内同时完成多项任务,不用线程间切换),但他在任何特定的时间点也只能做一项任务。他可以在等待烧水的过程中去做饭或者扫地,这样虽然仍然是一项一项地完成任务,但由于减少了等待资源的时间,整体上可以在相同的时间内完成更多的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值