看了很多资料,但感觉二者直观的区别和联系都没有讲的很清楚。各位大佬们如何理解并发和异步的?
比如以 Go 为例, channel,select,goroutine,这几个内置的特性,和并发/异步似乎都有关联。
![]() |
1
kujio 59 天前 ![]() 并发:多个线程同时干同样的事
异步:多个线程同时干不同的事 并发解决的是吞吐量的问题 异步解决的是阻塞问题 个人浅见 |
![]() |
2
sagaxu 59 天前 ![]() 并发,多个事情在同一个时间段内发生。
并行,多个事情在同一个时间点内发生。 同步,一个动作执行后,收到应答/反馈后进行下一个动作。 异步,一个动作执行后,不等待反馈就进行下一个动作。 同步阻塞,现在就取资源,没有就一直卡死着等。 同步非阻塞,外部资源就绪了通知我,我再去取。 异步非阻塞,我先干别的,资源就绪了给我放那里,我就不去取了。 异步阻塞,资源来了给我放那儿,我不会主动取,但我现在啥也不干卡死等着。 |
![]() |
3
Building 59 天前 ![]() 从名字就能区别出来吧,这两个也没有什么关系啊
并发:免费麦辣鸡翅下班时分冲进来一堆薅羊毛的 异步:顾客点单,把订单交给后台,给下一位顾客点单,听到后台摇铃铛出餐,把食物拿给之前点单的顾客... |
![]() |
4
helloluckydamon 59 天前
@Building 麦辣鸡翅哈哈哈哈哈哈哈哈😂有趣
|
8
CLMan 59 天前 ![]() 简单来讲,大部分程序都是输入-计算-输出的顺序执行流模式:
- 并发强调:允许逻辑上存在多个执行流同时执行 - 异步强调:执行流的顺序执行模型被打破了,实际的执行过程可能是:输入->提交计算任务->返回,计算的执行是不确定时间的,即与执行流脱钩 类似的问题个人认为是少看点比喻,因为它们与实际代码似是而非,反而容易弄混。 |
9
dobelee 59 天前
举个简单粗暴的日常例子。
异步:把任务丢给消息队列去执行。 并行:开多几个消费者让它执行快点。 |
![]() |
10
moonlight010 59 天前 via Android
并发说的是 cpu 执行,也就是进程线程之间的事
异步,说的是消息机制,是一直等着还是怎么着来通知获取 |
11
ariasigh 59 天前 via iPhone ![]() 异步跟线程无关,单线程也可以异步,非阻塞的操作都是异步操作。
并发也跟线程无关,可以是多线程,多进程或多机。 总之,异步跟并发是两个毫无关联的概念,不要搞混了 |
![]() |
12
ajaxgoldfish 59 天前 via Android
楼上说的对。不是一个层次的
|
13
0o0O0o0O0o 59 天前
我觉得从 Go 出发学这些概念可能容易混乱,因为 Go 就是围绕它们做了大量的设计,先用别的语言学一下概念,再去看 Go 里的一些设计,也许更好一些
|
14
skuuhui 58 天前
两个维度的事情。
并发是,你有两个快递要拿,一次拿两个就是并发,无论你一手拿一个,还是你和你老婆一起去每人拿一个。 同步是,菜鸟驿站老板把快递一个一个拿出来等你们取(当然前一个人一直没来拿,他也不会去取下一个) 异步是,菜鸟驿站老板坐在那里,谁菜鸟裹裹点了一件取货,再去拿给他。 |