异步可以看作是多线程的一种应用方式吗?比如 C#里表示异步的async/await
可以看作是多线程的一种语法糖吗?
1
EminemW 2020-11-14 00:49:01 +08:00 via iPhone
异步可以用多线程实现
|
2
supermoonie 2020-11-14 00:51:26 +08:00 via iPhone
异步一般是事件驱动 多线程实现的是伪异步
|
3
dustinth 2020-11-14 01:22:38 +08:00 2
不在一个概念层次.
异步相对概念是同步, 是一种编程范式, 同步是 block 当前 process 等待返回, 异步是不 block 而是等待通知, async/await 就是在概念上把异步变成同步的语法糖; 多线程 /单线程是一种计算资源分配方式; 同步操作可以用多线程实现, 虽然异步操作一般是有多线程计算的. |
4
inwar 2020-11-14 01:26:26 +08:00 via Android
@supermoonie 举例一个非多线程实现的异步呗
|
6
Goldilocks 2020-11-14 01:31:40 +08:00 1
Linux 基本上没有异步 io 。所以如果你想了解异步,你先去看 Windows Programming 的书,比如 Windows Via C/C++。里面有非常详细的介绍。Search overlapped i/o.
|
7
lithbitren 2020-11-14 01:37:34 +08:00 1
凡是支持主楼那两个关键字的语言基本都可以实现单线程里协程异步,比如说 JavaScript,Python,Rust 之类的。
|
8
binux 2020-11-14 01:41:22 +08:00 via Android
没有关系
|
9
Jirajine 2020-11-14 01:47:11 +08:00 via Android 3
多线程就是多线程,字面意思。
而异步这个词在不同语境下有不同的含义: 1. 表示流程。一个线程依次执行十个函数叫同步,每个函数都 spawn 到一个子线程里执行叫异步。 2. 表示 io 模型。等待 io 时会阻塞当前线程叫同步,不阻塞而是在有数据到达时通知叫异步。 3. 表示编程范式。每行一个语句依次执行叫同步,像传递回调函数那样使其在某个不确定的时刻执行叫异步。 4. 表示调度。async/await 语法糖可以看起来像同步一样依次执行,但实际上还是像回调函数那样在被调度后执行。 还有个相关的概念叫协程。顾名思义协程之间的调度是协作式的,一个协程会一直执行知道它自己主动挂起,runtime 才能(在当前线程上)执行其他协程。相比之下线程之间往往是抢占式的,一个线程跑着跑着会被强行中断,CPU 运行其他线程。 |
10
agagega 2020-11-14 01:54:49 +08:00 via iPhone
异步或同步;阻塞或非阻塞;单线程或多线程
这三组词是正交的,理论上有八种组合 |
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(),可以是单线程的事件循环中,也可以在别的线程。 |
12
lihongming 2020-11-14 02:51:36 +08:00
不想研究底层原理的话可以这么理解:
异步是针对你自己来说的。有一件事,需要另一件事完成后才能继续,如果你站在原地等,那就叫同步。如果等他干完了主动通知你继续,那就叫异步。 比如你去派出所办身份证,警察叔叔得先查你的户籍档案,然后才能给你办。如果你站在那里等,什么也不能干,那就叫同步。如果警察叔叔说,你先去忙别的吧,查完了我给你打电话,那就叫异步。 当然,没有身份证你可能无法“忙别的”,比如你下一个任务是去银行开户,那没有身份证就办不了,所以你就 await 。await 看起来跟同步的效果差不多,但你并不是站在那里等,而是在旁边找个椅子休息去了。这样你不再消耗资源,而且窗口也就可以继续接待下一个用户(如果有其它可用的警察叔叔的话),所以 async/await 的效率比同步高。 再说多线程,多线程是指同时有多件事在办,比如警察叔叔在查户籍档案的同时,你掏出手机发了个帖子。但如果你自己就是那个警察,自己给自己办身份证呢?那就是单线程了,但这并不影响上面那个异步流程,所以异步可以多线程,也可以单线程。 |
14
irytu 2020-11-14 02:59:49 +08:00 via iPhone
异步一般跟当前上下文 flow 没关系,参考异常控制流的概念,比如一个 running 的进程收到了来自 kernel deliver 的某个中断或者信号,对于这个进程来说,这个事件是“异步”的;
同步相反,同步就是指当前 flow 的过程; 多线程的话,看你选什么参考系了,每个线程都有各自的 flow,不考虑其他的,每个线程自身都是同步的;但是你从线程 A 看线程 B 那是异步执行了。 不过要说联系的话,我觉得多线程可以用来解决异步问题😂 |
15
yzbythesea 2020-11-14 03:41:07 +08:00
毫无关系。。。
一个是这个事件和主事件的运算关系 一个是线程 |
16
rpxwa 2020-11-14 03:44:56 +08:00 1
餐厅,只有一个服务员。
点菜候着你的,是同步阻塞。 趁你点菜去服务别桌的,是异步并发。 对于后者,你勾好菜单喊服务员来拿,是回调。 有多个服务员的,是多线程。 至于单个线程内部是写同步还是异步,随意。 大概就是并发在不同尺度的演绎:函数、线程、进程、处理器。 |