跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 异步和多线程这 2 个概念应该是什么个关系?
未分類
25 11 月 2020

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

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

資深大佬 : WangLiCha 4

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

大佬有話說 (16)

  • 資深大佬 : EminemW

    异步可以用多线程实现

  • 資深大佬 : supermoonie

    异步一般是事件驱动 多线程实现的是伪异步

  • 資深大佬 : dustinth

    不在一个概念层次.
    异步相对概念是同步, 是一种编程范式, 同步是 block 当前 process 等待返回, 异步是不 block 而是等待通知, async/await 就是在概念上把异步变成同步的语法糖;
    多线程 /单线程是一种计算资源分配方式; 同步操作可以用多线程实现, 虽然异步操作一般是有多线程计算的.

  • 資深大佬 : inwar

    @supermoonie 举例一个非多线程实现的异步呗

  • 資深大佬 : ss098

    @inwar NodeJS 实现的回调机制默认就是单线程异步。

  • 資深大佬 : Goldilocks

    Linux 基本上没有异步 io 。所以如果你想了解异步,你先去看 Windows Programming 的书,比如 Windows Via C/C++。里面有非常详细的介绍。Search overlapped i/o.

  • 資深大佬 : lithbitren

    凡是支持主那两个关键字的语言基本都可以实现单线程里协程异步,比如说 JavaScript,Python,Rust 之类的。

  • 資深大佬 : binux

    没有关系

  • 資深大佬 : Jirajine

    多线程就是多线程,字面意思。
    而异步这个词在不同语境下有不同的含义:
    1. 表示流程。一个线程依次执行十个函数叫同步,每个函数都 spawn 到一个子线程里执行叫异步。
    2. 表示 io 模型。等待 io 时会阻塞当前线程叫同步,不阻塞而是在有数据到达时通知叫异步。
    3. 表示编程范式。每行一个语句依次执行叫同步,像传递回调函数那样使其在某个不确定的时刻执行叫异步。
    4. 表示调度。async/await 语法糖可以看起来像同步一样依次执行,但实际上还是像回调函数那样在被调度后执行。
    还有个相关的概念叫协程。顾名思义协程之间的调度是协作式的,一个协程会一直执行知道它自己主动挂起,runtime 才能(在当前线程上)执行其他协程。相比之下线程之间往往是抢占式的,一个线程跑着跑着会被强行中断,CPU 运行其他线程。

  • 資深大佬 : agagega

    异步或同步;阻塞或非阻塞;单线程或多线程

    这三组词是正交的,理论上有八种组合

  • 資深大佬 : ysc3839

    “异步”这个概念很宽泛,如果只谈论 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

    不想研究底层原理的话可以这么理解:

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

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

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

    再说多线程,多线程是指同时有多件事在办,比如警察叔叔在查户籍档案的同时,你掏出手机发了个帖子。但如果你自己就是那个警察,自己给自己办身份证呢?那就是单线程了,但这并不影响上面那个异步流程,所以异步可以多线程,也可以单线程。

  • 資深大佬 : Yvette

    @inwar JavaScript 运行时用的 event loop 就是单线程异步

  • 資深大佬 : irytu

    异步一般跟当前上下文 flow 没关系,参考异常控制流的概念,比如一个 running 的进程收到了来自 kernel deliver 的某个中断或者信号,对于这个进程来说,这个事件是“异步”的;

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

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

    不过要说联系的话,我觉得多线程可以用来解决异步问题

  • 資深大佬 : yzbythesea

    毫无关系。。。

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

    一个是线程

  • 資深大佬 : rpxwa

    餐厅,只有一个服务员。
    点菜候着你的,是同步阻塞。
    趁你点菜去服务别桌的,是异步并发。
    对于后者,你勾好菜单喊服务员来拿,是回调。
    有多个服务员的,是多线程。

    至于单个线程内部是写同步还是异步,随意。
    大概就是并发在不同尺度的演绎:函数、线程、进程、处理器。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具