V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
seekseat
V2EX  ›  编程

并发编程和异步编程的区别

  •  
  •   seekseat · 2024-07-10 18:18:53 +08:00 · 2254 次点击
    这是一个创建于 423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了很多资料,但感觉二者直观的区别和联系都没有讲的很清楚。各位大佬们如何理解并发和异步的?

    比如以 Go 为例, channel,select,goroutine,这几个内置的特性,和并发/异步似乎都有关联。

    14 条回复    2024-07-11 08:54:02 +08:00
    kujio
        1
    kujio  
       2024-07-10 19:48:41 +08:00   ❤️ 3
    并发:多个线程同时干同样的事
    异步:多个线程同时干不同的事
    并发解决的是吞吐量的问题
    异步解决的是阻塞问题
    个人浅见
    sagaxu
        2
    sagaxu  
       2024-07-10 20:09:26 +08:00   ❤️ 1
    并发,多个事情在同一个时间段内发生。
    并行,多个事情在同一个时间点内发生。

    同步,一个动作执行后,收到应答/反馈后进行下一个动作。
    异步,一个动作执行后,不等待反馈就进行下一个动作。

    同步阻塞,现在就取资源,没有就一直卡死着等。
    同步非阻塞,外部资源就绪了通知我,我再去取。

    异步非阻塞,我先干别的,资源就绪了给我放那里,我就不去取了。
    异步阻塞,资源来了给我放那儿,我不会主动取,但我现在啥也不干卡死等着。
    Building
        3
    Building  
       2024-07-10 20:17:12 +08:00   ❤️ 1
    从名字就能区别出来吧,这两个也没有什么关系啊
    并发:免费麦辣鸡翅下班时分冲进来一堆薅羊毛的
    异步:顾客点单,把订单交给后台,给下一位顾客点单,听到后台摇铃铛出餐,把食物拿给之前点单的顾客...
    byehair
        4
    byehair  
       2024-07-10 21:03:48 +08:00
    @Building 麦辣鸡翅哈哈哈哈哈哈哈哈😂有趣
    seekseat
        5
    seekseat  
    OP
       2024-07-10 21:46:49 +08:00
    @kujio 赞!
    seekseat
        6
    seekseat  
    OP
       2024-07-10 21:46:59 +08:00
    @sagaxu 感谢~
    seekseat
        7
    seekseat  
    OP
       2024-07-10 21:47:29 +08:00
    @Building 参考楼上的两位,感觉还是有些关联的
    CLMan
        8
    CLMan  
       2024-07-10 23:06:38 +08:00   ❤️ 1
    简单来讲,大部分程序都是输入-计算-输出的顺序执行流模式:

    - 并发强调:允许逻辑上存在多个执行流同时执行
    - 异步强调:执行流的顺序执行模型被打破了,实际的执行过程可能是:输入->提交计算任务->返回,计算的执行是不确定时间的,即与执行流脱钩

    类似的问题个人认为是少看点比喻,因为它们与实际代码似是而非,反而容易弄混。
    dobelee
        9
    dobelee  
       2024-07-10 23:12:37 +08:00
    举个简单粗暴的日常例子。
    异步:把任务丢给消息队列去执行。
    并行:开多几个消费者让它执行快点。
    moonlight010
        10
    moonlight010  
       2024-07-10 23:23:12 +08:00 via Android
    并发说的是 cpu 执行,也就是进程线程之间的事
    异步,说的是消息机制,是一直等着还是怎么着来通知获取
    ariasigh
        11
    ariasigh  
       2024-07-10 23:23:31 +08:00 via iPhone   ❤️ 1
    异步跟线程无关,单线程也可以异步,非阻塞的操作都是异步操作。

    并发也跟线程无关,可以是多线程,多进程或多机。

    总之,异步跟并发是两个毫无关联的概念,不要搞混了
    ih8es9OIzne0959p
        12
    ih8es9OIzne0959p  
       2024-07-10 23:31:45 +08:00 via Android
    楼上说的对。不是一个层次的
    0o0O0o0O0o
        13
    0o0O0o0O0o  
       2024-07-10 23:38:01 +08:00
    我觉得从 Go 出发学这些概念可能容易混乱,因为 Go 就是围绕它们做了大量的设计,先用别的语言学一下概念,再去看 Go 里的一些设计,也许更好一些
    skuuhui
        14
    skuuhui  
       2024-07-11 08:54:02 +08:00
    两个维度的事情。
    并发是,你有两个快递要拿,一次拿两个就是并发,无论你一手拿一个,还是你和你老婆一起去每人拿一个。
    同步是,菜鸟驿站老板把快递一个一个拿出来等你们取(当然前一个人一直没来拿,他也不会去取下一个)
    异步是,菜鸟驿站老板坐在那里,谁菜鸟裹裹点了一件取货,再去拿给他。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2459 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 01:37 · PVG 09:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.