异步和多线程这 2 个概念应该是什么个关系?
异步可以看作是多线程的一种应用方式吗?比如 C#里表示异步的async/await可以看作是多线程的一种语法糖吗?
异步可以看作是多线程的一种应用方式吗?比如 C#里表示异步的async/await可以看作是多线程的一种语法糖吗?
这三组词是正交的,理论上有八种组合
而使用 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(),可以是单线程的事件循环中,也可以在别的线程。
异步是针对你自己来说的。有一件事,需要另一件事完成后才能继续,如果你站在原地等,那就叫同步。如果等他干完了主动通知你继续,那就叫异步。
比如你去派出所办身份证,警察叔叔得先查你的户籍档案,然后才能给你办。如果你站在那里等,什么也不能干,那就叫同步。如果警察叔叔说,你先去忙别的吧,查完了我给你打电话,那就叫异步。
当然,没有身份证你可能无法“忙别的”,比如你下一个任务是去银行开户,那没有身份证就办不了,所以你就 await 。await 看起来跟同步的效果差不多,但你并不是站在那里等,而是在旁边找个椅子休息去了。这样你不再消耗资源,而且窗口也就可以继续接待下一个用户(如果有其它可用的警察叔叔的话),所以 async/await 的效率比同步高。
再说多线程,多线程是指同时有多件事在办,比如警察叔叔在查户籍档案的同时,你掏出手机发了个帖子。但如果你自己就是那个警察,自己给自己办身份证呢?那就是单线程了,但这并不影响上面那个异步流程,所以异步可以多线程,也可以单线程。
同步相反,同步就是指当前 flow 的过程;
多线程的话,看你选什么参考系了,每个线程都有各自的 flow,不考虑其他的,每个线程自身都是同步的;但是你从线程 A 看线程 B 那是异步执行了。
不过要说联系的话,我觉得多线程可以用来解决异步问题
一个是这个事件和主事件的运算关系
一个是线程
至于单个线程内部是写同步还是异步,随意。
大概就是并发在不同尺度的演绎:函数、线程、进程、处理器。