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

异步和多线程这 2 个概念应该是什么个关系?

  •  
  •   WangLiCha · 2020-11-14 00:43:17 +08:00 · 3261 次点击
    这是一个创建于 1500 天前的主题,其中的信息可能已经有所发展或是发生改变。

    异步可以看作是多线程的一种应用方式吗?比如 C#里表示异步的async/await可以看作是多线程的一种语法糖吗?

    16 条回复    2020-11-14 03:44:56 +08:00
    EminemW
        1
    EminemW  
       2020-11-14 00:49:01 +08:00 via iPhone
    异步可以用多线程实现
    supermoonie
        2
    supermoonie  
       2020-11-14 00:51:26 +08:00 via iPhone
    异步一般是事件驱动 多线程实现的是伪异步
    dustinth
        3
    dustinth  
       2020-11-14 01:22:38 +08:00   ❤️ 2
    不在一个概念层次.
    异步相对概念是同步, 是一种编程范式, 同步是 block 当前 process 等待返回, 异步是不 block 而是等待通知, async/await 就是在概念上把异步变成同步的语法糖;
    多线程 /单线程是一种计算资源分配方式; 同步操作可以用多线程实现, 虽然异步操作一般是有多线程计算的.
    inwar
        4
    inwar  
       2020-11-14 01:26:26 +08:00 via Android
    @supermoonie 举例一个非多线程实现的异步呗
    ss098
        5
    ss098  
       2020-11-14 01:29:50 +08:00 via iPhone
    @inwar NodeJS 实现的回调机制默认就是单线程异步。
    Goldilocks
        6
    Goldilocks  
       2020-11-14 01:31:40 +08:00   ❤️ 1
    Linux 基本上没有异步 io 。所以如果你想了解异步,你先去看 Windows Programming 的书,比如 Windows Via C/C++。里面有非常详细的介绍。Search overlapped i/o.
    lithbitren
        7
    lithbitren  
       2020-11-14 01:37:34 +08:00   ❤️ 1
    凡是支持主楼那两个关键字的语言基本都可以实现单线程里协程异步,比如说 JavaScript,Python,Rust 之类的。
    binux
        8
    binux  
       2020-11-14 01:41:22 +08:00 via Android
    没有关系
    Jirajine
        9
    Jirajine  
       2020-11-14 01:47:11 +08:00 via Android   ❤️ 3
    多线程就是多线程,字面意思。
    而异步这个词在不同语境下有不同的含义:
    1. 表示流程。一个线程依次执行十个函数叫同步,每个函数都 spawn 到一个子线程里执行叫异步。
    2. 表示 io 模型。等待 io 时会阻塞当前线程叫同步,不阻塞而是在有数据到达时通知叫异步。
    3. 表示编程范式。每行一个语句依次执行叫同步,像传递回调函数那样使其在某个不确定的时刻执行叫异步。
    4. 表示调度。async/await 语法糖可以看起来像同步一样依次执行,但实际上还是像回调函数那样在被调度后执行。
    还有个相关的概念叫协程。顾名思义协程之间的调度是协作式的,一个协程会一直执行知道它自己主动挂起,runtime 才能(在当前线程上)执行其他协程。相比之下线程之间往往是抢占式的,一个线程跑着跑着会被强行中断,CPU 运行其他线程。
    agagega
        10
    agagega  
       2020-11-14 01:54:49 +08:00 via iPhone
    异步或同步;阻塞或非阻塞;单线程或多线程

    这三组词是正交的,理论上有八种组合
    ysc3839
        11
    ysc3839  
       2020-11-14 02:24:29 +08:00
    “异步”这个概念很宽泛,如果只谈论 C#, JS, C++ 里面的 async/await 的话,这可以看成是回调函数的语法糖。
    基于回调的异步代码一般会写成这样:
    do_first_job(/* on_finish= */ function() {
    do_second_job(/* on_finish= */ function() {
    do_third_job(/* on_finish= */ function() {
    ...
    });
    });
    });
    这样一层套一层就形成了“回调地狱”。

    而使用 async/await 的话,可以写成这样:
    await do_first_job();
    await do_second_job();
    await do_third_job();

    对于 do_xxx_job 的实现者来说,他仍然是拿到了一个“类似回调函数”的东西。比如 C++ 中可以拿到一个 coroutine handle,调用 handle 的 resume 函数,就可以继续执行。

    结论是 async/await 并不关心是否是多线程 (C++ 的情况),这完全取决于 do_xxx_job 在什么地方调用 handle.resume(),可以是单线程的事件循环中,也可以在别的线程。
    lihongming
        12
    lihongming  
       2020-11-14 02:51:36 +08:00
    不想研究底层原理的话可以这么理解:

    异步是针对你自己来说的。有一件事,需要另一件事完成后才能继续,如果你站在原地等,那就叫同步。如果等他干完了主动通知你继续,那就叫异步。

    比如你去派出所办身份证,警察叔叔得先查你的户籍档案,然后才能给你办。如果你站在那里等,什么也不能干,那就叫同步。如果警察叔叔说,你先去忙别的吧,查完了我给你打电话,那就叫异步。

    当然,没有身份证你可能无法“忙别的”,比如你下一个任务是去银行开户,那没有身份证就办不了,所以你就 await 。await 看起来跟同步的效果差不多,但你并不是站在那里等,而是在旁边找个椅子休息去了。这样你不再消耗资源,而且窗口也就可以继续接待下一个用户(如果有其它可用的警察叔叔的话),所以 async/await 的效率比同步高。

    再说多线程,多线程是指同时有多件事在办,比如警察叔叔在查户籍档案的同时,你掏出手机发了个帖子。但如果你自己就是那个警察,自己给自己办身份证呢?那就是单线程了,但这并不影响上面那个异步流程,所以异步可以多线程,也可以单线程。
    Yvette
        13
    Yvette  
       2020-11-14 02:55:00 +08:00
    @inwar JavaScript 运行时用的 event loop 就是单线程异步
    irytu
        14
    irytu  
       2020-11-14 02:59:49 +08:00 via iPhone
    异步一般跟当前上下文 flow 没关系,参考异常控制流的概念,比如一个 running 的进程收到了来自 kernel deliver 的某个中断或者信号,对于这个进程来说,这个事件是“异步”的;

    同步相反,同步就是指当前 flow 的过程;

    多线程的话,看你选什么参考系了,每个线程都有各自的 flow,不考虑其他的,每个线程自身都是同步的;但是你从线程 A 看线程 B 那是异步执行了。

    不过要说联系的话,我觉得多线程可以用来解决异步问题😂
    yzbythesea
        15
    yzbythesea  
       2020-11-14 03:41:07 +08:00
    毫无关系。。。

    一个是这个事件和主事件的运算关系

    一个是线程
    rpxwa
        16
    rpxwa  
       2020-11-14 03:44:56 +08:00   ❤️ 1
    餐厅,只有一个服务员。
    点菜候着你的,是同步阻塞。
    趁你点菜去服务别桌的,是异步并发。
    对于后者,你勾好菜单喊服务员来拿,是回调。
    有多个服务员的,是多线程。

    至于单个线程内部是写同步还是异步,随意。
    大概就是并发在不同尺度的演绎:函数、线程、进程、处理器。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2844 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:38 · PVG 22:38 · LAX 06:38 · JFK 09:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.