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

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

  •  
  •   seekseat · 137 天前 · 1694 次点击
    这是一个创建于 137 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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