async/await 和 golang 协程,好像不在一个易用性程度上。

2018-01-17 17:15:47 +08:00
 owenliang

最近在看 async/await 模型的协程,貌似 async 必须 await..

Golang 首先不用 await 一个 courotine,其次可以 select+channel...

你们可以教教我怎么 async+await 实现并发协程么?

9420 次点击
所在节点    Python
25 条回复
wellsc
2018-01-17 17:24:06 +08:00
两者其实不是一个层级的东西,asyncio 只是暴露了协程的 Python 接口供开发者使用,充其量就是加了点语法糖。Golang 则是建立在 CSP model 上来调度协程,底层已经封装了很多东西了。
owenliang
2018-01-17 17:26:53 +08:00
@wellsc 我理解目前 asyncio 能做的就是把常用的 tcp server 重度封装一下,把 accept 阶段扇出 coroutine 的事情帮用户做了,剩下的基本靠用户自己基于 event driven loop+generator 再封装的样子。
wellsc
2018-01-17 17:29:13 +08:00
@owenliang #2 asyncio 是操作系统层面的协程接口,csp 是并发模型
owenliang
2018-01-17 17:30:56 +08:00
@wellsc event driven 本身是并发的,结果语法糖到 await,async 上变成了串行的,附赠了一个 wait_all 之类的糖说可以并发,感觉略扯。
chenqh
2018-01-17 17:31:30 +08:00
你把 golang 的协程当成别一种线程就容易理解了
owenliang
2018-01-17 17:36:19 +08:00
很多年前造过 C+lua 协程的网络框架,实际上也是在 C 层把常用的 server 和 read/write api 都封装好了,直接给 connection 协程用,所以当时并没有觉得这种协程模型难受。

链接: http://bbs.chinaunix.net/thread-4076795-1-1.html

但是我觉得在一个提倡简单的脚本语言里搞这种半成品,实在是费解。
qsnow6
2018-01-17 17:41:05 +08:00
暂时没好的解决方案,将个烂就
owenliang
2018-01-17 17:42:35 +08:00
照我看,asyncio 里的 loop 可能比较有用,其他的语法就算了 -,-#
owenliang
2018-01-17 19:39:42 +08:00
竟然有 goless 这种库,配合 gevent 模拟 go 的 csp 模型
est
2018-01-17 19:54:15 +08:00
继续 gevent 走起。
Contextualist
2018-01-17 19:56:35 +08:00
说到 goless 我就想起了 offset ( https://github.com/benoitc/offset ),这个还重写了异步版标准库,可惜基于 fiber,有些弱。不过这俩库的作者貌似都弃坑了…… 之前我都玩过一下,好像效果跟 golang 的还是有些差异
chengzhoukun
2018-01-17 20:00:28 +08:00
async/await 是 C#最先用的吧,然后是 Python,JS,
不过 python 里面搞的确实复杂了,flask 作者就写过一篇文章:
http://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/
loading
2018-01-17 20:05:23 +08:00
go func 就我这种菜鸟都会用了。
owenliang
2018-01-17 20:08:58 +08:00
@Contextualist 老玩家,难道你已经看透
owenliang
2018-01-17 20:09:15 +08:00
@chengzhoukun 了解一下
clino
2018-01-17 20:21:05 +08:00
gevent +1
missdeer
2018-01-17 20:40:34 +08:00
@owenliang 一直有个问题想不明白,Lua 的 coroutine 是协作调度的,也就是说当前执行的 coroutine 自己主动 yield 出去,其他 coroutine 才有机会执行。那如果当 coroutine 遇到了会 block 的操作时,怎么 yield 出去,什么时候 yield ?不然不在被 block 时 yield 出去,怎么做到多个 coroutine 并发的效果呢?
owenliang
2018-01-17 20:50:28 +08:00
@missdeer lua 实际上是为 c 服务的,主体在 c。lua 有协程能力,简单说就是保存上下文暂停执行( yield ),让你感觉同步写逻辑。c 有事件驱动能力,为 lua api 提供异步能力。所以 c 基本是做服务框架和 lua api 的异步逻辑,而 lua 做 api 的壳以及切换到 c 异步事件之前的 yield 调用。
owenliang
2018-01-17 20:51:24 +08:00
@owenliang 补充一下,c 在事件完成后 resume lua 的协程。
owenliang
2018-01-17 20:55:28 +08:00
gevent 我还需要再看看特性,有类线程和队列,但没有多路。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/423681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX