并发是指两个或多个任务可以在重叠的时间段内启动,运行和完成。这并不一定意味着它们都会在同一时刻运行。例如,在单核机器上进行多任务处理 。
是并行任务时在同一时间从字面上运行,例如,在多核处理器上。
引用Sun 的多线程编程指南 :
并发:当至少两个线程正在进行时存在的条件。一种更通用的并行形式,可以包括时间切片作为虚拟并行的一种形式。
并行性:当至少两个线程同时执行时出现的情况。
存在混淆,因为这两个词的字典含义几乎相同:
然而,它们在计算机科学和编程中的使用方式却截然不同。这是我的解释:
那么上面的定义是什么意思呢?
我将用现实世界的比喻来澄清。假设您必须在一天内完成 2 项非常重要的任务:
现在,问题是任务 - 1 要求你去一个极端官僚的政府办公室,让你等了 4 个小时才能拿到你的护照。同时,办公室需要任务 2,这是一项关键任务。两者都必须在特定日期完成。
通常情况下,你会开车到护照办公室 2 个小时,在线等待 4 个小时,完成任务,开车两个小时,回家,保持清醒 5 个小时,然后完成演示。
但你很聪明。你提前计划。你随身携带一台笔记本电脑,在排队等候时,你开始制作你的演示文稿了。这样,一旦你回到家,你只需要额外工作 1 小时而不是 5 小时。
在这种情况下,两个任务都由您完成,只是分片。你在排队等候的时候打断了护照任务并进行了演示。当您的号码被呼叫时,您中断了演示任务并切换到护照任务。由于两个任务的中断性,基本上可以节省时间。
并发,IMO,可以理解为ACID 中的 “隔离” 属性。如果可以以每种交错方式执行子事务并且最终结果与两个任务按顺序完成相同,则认为两个数据库事务是隔离的。请记住,对于护照和演示任务, 您是唯一的刽子手 。
现在,既然你是一个聪明的家伙,你显然是一个更高级的,你有一个助手。因此,在您离开开始护照任务之前,您打电话给他并告诉他准备演示文稿的初稿。你花了一整天的时间完成护照任务,回来看看你的邮件,然后找到演示稿。他已经完成了相当可靠的工作,并且在 2 个小时内进行了一些编辑,你最终确定了它。
既然如此,你的助手就像你一样聪明,他能够独立工作,而不需要经常要求你澄清。因此,由于任务的可独立性,它们由两个不同的执行者同时执行 。
还在我这儿?好的...
记住你的护照任务,你必须在排队等候?由于这是您的护照,您的助手不能排队等候。因此,护照任务具有可中断性 (您可以在排队等候时停止它,并在稍后调用您的号码时恢复它),但不具有可独立性 (您的助手不能代替您等待)。
假设政府办公室有进入房屋的安全检查。在这里,您必须删除所有电子设备并将其提交给官员,并且他们仅在您完成任务后返回您的设备。
在这种情况下,护照任务既不可独立也不可中断 。即使您在排队等候,也无法使用其他设备,因为您没有必要的设备。
同样地,假设演示文稿在数学上具有如此高的数学性能,您需要 100%浓度至少 5 小时。即使您有自己的笔记本电脑,也不能在排队等待护照任务时这样做。
在这种情况下,演示任务是可独立的 (您或您的助手可以投入 5 小时的集中精力),但不可中断 。
现在,请说除了将助理分配到演示文稿之外,您还随身携带一台笔记本电脑到护照任务。在排队等候时,您会看到助手已在共享卡组中创建了前 10 张幻灯片。您通过一些更正发送有关其工作的评论。之后,当你到家时,而不是 2 小时完成选秀,你只需要 15 分钟。
这是可能的,因为演示任务具有可独立性 (你们中的任何一个都可以做到)和可中断性 (你可以停止并稍后恢复)。因此,您同时执行了这两个任务,并并行执行了演示任务。
让我们说,除了过于官僚之外,政府办公室也是腐败的。因此,你可以显示你的身份证明,输入它,开始排队等候你的号码,贿赂一个警卫和其他人来保持你的位置,潜行,在你的电话号码被召回之前回来,并恢复等待你自己。
在这种情况下,您可以同时并行执行护照和演示任务。你可以偷偷溜出来,你的位置由你的助手保管。然后你们两个都可以进行演示等。
在计算世界中,以下是每种情况的典型示例场景:
如果你看到为什么 Rob Pike 说并发性更好,你必须明白原因是。您有一个非常长的任务,其中有多个等待期间,您等待一些外部操作,如文件读取,网络下载。在他的演讲中,他所说的只是,“只是打破这个长时间的顺序任务,这样你就可以在等待的时候做一些有用的事情。” 这就是为什么他谈论不同组织与各种地鼠。
现在,Go 的优势在于使用go
关键字和频道让这一点变得非常简单。此外,在运行时中有很好的底层支持来安排这些 goroutine。
但基本上,并发性更好的是并发性?
苹果比橘子好吗?