< 返回版块

heliping 发表于 2022-11-24 10:38

一直不理解异步,在golang中有协程,基本相当于消耗资源极少的,所以有这种设计,其实不需要异步的。

异步也不过是节约主进程,那我随便就可以开多个主进程,为什么要异步?有大佬解释下吗?

评论区

写评论
Jancd 2022-11-26 15:41

👍🏻

--
👇
Aya0wind: rust的async await也是可以用来实现协程的,tokio就是一个无栈协程库,不要换了个马甲就不认识了。
协程是进行异步操作的其中一种方式,这两个根本不是一个维度上的东西,怎么比较?
异步的价值应该是跟同步对比,而不是跟协程对比,协程应该跟比如线程池,IO多路复用,AIO等其他的异步机制对比。

Aya0wind 2022-11-24 18:52

rust的async await也是可以用来实现协程的,tokio就是一个无栈协程库,不要换了个马甲就不认识了。
协程是进行异步操作的其中一种方式,这两个根本不是一个维度上的东西,怎么比较?
异步的价值应该是跟同步对比,而不是跟协程对比,协程应该跟比如线程池,IO多路复用,AIO等其他的异步机制对比。

Nayaka 2022-11-24 18:06

你对异步/协程的理解可能跟大多数人有偏差

协程(Coroutine)是实现异步(Asynchronous)的一种方式,Golang的goroutine是stackful coroutine, async/await是stackless coroutine

异步是现象,协程是产生现象的方式

--
👇
heliping: 我的理解是这样:

协程: 主进程在启动协程之后,协程和主进程再无关系,两者可以通过channel通信,但协程已经单干了。 主进程结束后,如果没有等待锁,协程也一同完成。底层怎么实现不讨论。

异步: 主进程碰到异步后,如果异步任务阻塞,先做其他的事情,返回来再做之前阻塞的任务,多个任务之间切换。

--
👇
Cherrs: 难道是我的理解不对吗,协程不是实现异步的一种封装吗?

wangbyby 2022-11-24 14:59

https://rust-lang.github.io/async-book/01_getting_started/02_why_async.html

Coroutines, like threads, don't require changes to the programming model, which makes them easy to use. Like async, they can also support a large number of tasks. However, they abstract away low-level details that are important for systems programming and custom runtime implementors.

可以看下async-book的说法,异步也是一种并发模型但有更多的细节信息。

作者 heliping 2022-11-24 14:48

我的理解是这样:

协程: 主进程在启动协程之后,协程和主进程再无关系,两者可以通过channel通信,但协程已经单干了。 主进程结束后,如果没有等待锁,协程也一同完成。底层怎么实现不讨论。

异步: 主进程碰到异步后,如果异步任务阻塞,先做其他的事情,返回来再做之前阻塞的任务,多个任务之间切换。

--
👇
Cherrs: 难道是我的理解不对吗,协程不是实现异步的一种封装吗?

Cherrs 2022-11-24 14:35

难道是我的理解不对吗,协程不是实现异步的一种封装吗?

作者 heliping 2022-11-24 14:19

确实,但是我的意思是,协程也可以解决啊,而且不考虑开销的话,协程更好理解。

而现在rust正火的tokio库,主推异步。

golang没有异步,协程写起来非常方便。

rust圣经如下表述,都是支持的,但是现在好像都把尽力放到异步上面去了。

总之,Rust 经过权衡取舍后,最终选择了同时提供多线程编程和 async 编程:

前者通过标准库实现,当你无需那么高的并发时,例如需要并行计算时,可以选择它,优点是线程内的代码执行效率更高、实现更直观更简单,这块内容已经在多线程章节进行过深入讲解,不再赘述
后者通过语言特性 + 标准库 + 三方库的方式实现,在你需要高并发、异步 I/O 时,选择它就对了

--
👇
Easonzero: 因为大量的业务逻辑/硬件通信本质需要的就是异步, 比如超时逻辑, 而一个异步框架能够降低这些需求的实现复杂度

Easonzero 2022-11-24 13:50

因为大量的业务逻辑/硬件通信本质需要的就是异步, 比如超时逻辑, 而一个异步框架能够降低这些需求的实现复杂度

Cherrs 2022-11-24 12:53

比如tokio,你可以只开rt future不开启rt-multi-thread future。这样就是单线程了 但他还是异步

--
👇
Cherrs: 协程可以多线程,async/await也可以单线程 异步不等于多线程

Cherrs 2022-11-24 12:49

协程可以多线程,async/await也可以单线程 异步不等于多线程

1 共 10 条评论, 1 页