hzqd 发表于 2021-02-22 23:46
我发现很多时候人们混淆了并发与并行。 我理解的 async await 是并发,但总有人和并行相提并论。
何时该用并发,何时该用并行,这是一个问题。 大家是如何运用并发与并行的呢?
future 返回 not ready 让出当前 cpu 给其他 future 运行是并发。 多核同时运行多个 future 是并行。
个人不觉得 async await 能和其中任何一个划等号。
async await并没有规定底层要并发还是并行,单线程还是多线程,对用户来说async await只是一个发起和等待异步任务的工具,关注底层是怎么做的那是写异步运行时的人要考虑的,像tokio就是底层用了线程池然后多个线程并行的,用户发起任务之后把任务按负载分配到不同线程的任务队列去,这必然是并行执行的。但是你依然可以让同样的代码换其他只能单线程的异步运行时(tokio也可以设置线程数),这样又变成并发了。所以断言async await就是并发或者并行是没有意义的,决定这个的应该是运行时而不是async await语法。
并发是对业务来说,并行是对计算来说。
其实绝大部分情况下并不用过分关注这个问题。
比如,async 编程,tokio自动为你处理,不管是在一个核上的并发调度,还是多核上的并行调度,都是内部已经实现了的,对上层业务,不需要关心。
目的就是把机器性能压榨到最大,不是么?
那种纯计算项目,是需要关注并行化的。
评论区
写评论future 返回 not ready 让出当前 cpu 给其他 future 运行是并发。 多核同时运行多个 future 是并行。
个人不觉得 async await 能和其中任何一个划等号。
async await并没有规定底层要并发还是并行,单线程还是多线程,对用户来说async await只是一个发起和等待异步任务的工具,关注底层是怎么做的那是写异步运行时的人要考虑的,像tokio就是底层用了线程池然后多个线程并行的,用户发起任务之后把任务按负载分配到不同线程的任务队列去,这必然是并行执行的。但是你依然可以让同样的代码换其他只能单线程的异步运行时(tokio也可以设置线程数),这样又变成并发了。所以断言async await就是并发或者并行是没有意义的,决定这个的应该是运行时而不是async await语法。
并发是对业务来说,并行是对计算来说。
其实绝大部分情况下并不用过分关注这个问题。
比如,async 编程,tokio自动为你处理,不管是在一个核上的并发调度,还是多核上的并行调度,都是内部已经实现了的,对上层业务,不需要关心。
目的就是把机器性能压榨到最大,不是么?
那种纯计算项目,是需要关注并行化的。