V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alexapollo
V2EX  ›  程序员

是认真学异步编程好,还是投身 golang?

  •  
  •   alexapollo ·
    geekan · 2014-12-26 22:19:19 +08:00 · 5999 次点击
    这是一个创建于 3410 天前的主题,其中的信息可能已经有所发展或是发生改变。

    异步编程经常有callback地狱,虽然可以用promise解决一些,但仍然会写的很痛苦,开发效率低极了
    golang的用户态线程直接就让人用同步写异步逻辑啊

    40 条回复    2014-12-29 21:51:16 +08:00
    ETiV
        1
    ETiV  
       2014-12-26 22:25:00 +08:00 via iPhone
    做web的,js不会行么…

    俩都学呗,技多不压身
    est
        2
    est  
       2014-12-26 22:28:58 +08:00
    golang吧。
    alexapollo
        3
    alexapollo  
    OP
       2014-12-26 22:31:16 +08:00
    @ETiV c++的=_=
    aszxqw
        4
    aszxqw  
       2014-12-26 22:31:25 +08:00
    golang
    datou552211
        5
    datou552211  
       2014-12-26 22:31:58 +08:00
    js + golang
    ffffwh
        6
    ffffwh  
       2014-12-26 23:46:27 +08:00
    js:人力CPS(Continuation Passing Style)变换
    go:CSP(Communicating Sequential Processes)、actor model
    zjdboy
        7
    zjdboy  
       2014-12-26 23:57:59 +08:00
    golang
    Akagi201
        8
    Akagi201  
       2014-12-27 11:37:59 +08:00 via iPhone
    libuv
    semicircle21
        9
    semicircle21  
       2014-12-27 11:46:33 +08:00
    @alexapollo 你是从 c++ 世界来的, 如果我提醒你 golang 没有模板/泛型, 没有继承, 根本就不是面向对象的, 只是 c 语言的增强版, 你还会爱 golang 吗?
    Comdex
        10
    Comdex  
       2014-12-27 12:26:31 +08:00
    golang简单高效,妥妥的,不要用惯性思维看待一门新语言。
    alexapollo
        11
    alexapollo  
    OP
       2014-12-27 13:46:37 +08:00
    @semicircle21 我以前是写C的,现在写C++写得想吐
    golang大法好!

    有宏吗?
    alexapollo
        12
    alexapollo  
    OP
       2014-12-27 13:47:52 +08:00
    @ffffwh 好专业,有通俗易懂的版本没……
    semicircle21
        13
    semicircle21  
       2014-12-27 15:23:36 +08:00
    @alexapollo 没有宏, 这个恐怕不算是个缺陷,
    如果你用不惯 c++, 那你确实适合 golang , 而且我个人觉得 interface 的设计很不错 ...(略去展开的65535字)
    alexapollo
        14
    alexapollo  
    OP
       2014-12-27 19:37:34 +08:00
    @semicircle21 你确定吗……没有宏很多东西不好写
    它最大的优点是什么?
    pertersonvv
        15
    pertersonvv  
       2014-12-27 20:47:05 +08:00
    @ETiV 在加一个Ruby,学仨个吧:)
    ffffwh
        16
    ffffwh  
       2014-12-27 22:08:17 +08:00
    @alexapollo
    据说是“背后的原理”,我也是一知半解,深入了解的计划还在todo list里。
    js回调函数,可以看成是continuation(延续,当前执行点然后要做的事情)。传一个回调函数,又叫continuation passing style。
    有些语言,支持first-class continuation,可以自动把当前点的continuation捕获,放到一个变量里去,这个变量就像闭包函数一样可以随便传。由此可以达成“以同步的方式书写异步的代码”。
    像这个教程最后的部分 http://docs.racket-lang.org/more/index.html。
    这方面我给自己留的书单是 EOPL。
    noli
        17
    noli  
       2014-12-27 23:43:46 +08:00 via iPhone
    c++不想异步回调不是还有boost::coroutine吗?
    alexapollo
        18
    alexapollo  
    OP
       2014-12-28 02:37:37 +08:00
    @noli 还不是特别会协程,但好像性能一般会比纯异步差一些
    pertersonvv
        19
    pertersonvv  
       2014-12-28 20:46:54 +08:00
    楼主开始搞Go了么?
    yangxin0
        20
    yangxin0  
       2014-12-28 22:02:17 +08:00   ❤️ 1
    不要企图用一门语言让自己牛逼。
    mengzhuo
        21
    mengzhuo  
       2014-12-28 23:07:02 +08:00
    20楼说的在理

    libev go 在Linux都用了Epoll
    理解Epoll之后,这些都不是事,接下来是团队合作速度和产品生命周期的取舍问题了
    semicircle21
        22
    semicircle21  
       2014-12-29 10:41:22 +08:00
    @alexapollo 基本是我自己的主观感受:
    宏太灵活了, 存在被滥用的可能, 而且有时, 由宏导致的错误很难很难发现. 如果在 c 里有选择的话, 我更希望用其他语言特性替代宏.

    interface: 以前在C语言里常用 "一组的函数指针用结构体封装" 的模式当做接口, 或者说是类似 OO 里"模板方法", 这是我很喜欢的模式, 现在 golang 明白无误的管这种设计叫 interface, (当然, 这个interface 这种设计问题属于口味问题, golang 了不起的地方还是协程balabala)
    semicircle21
        23
    semicircle21  
       2014-12-29 10:42:35 +08:00
    @alexapollo 还有, golang 的闭包实际是个坑, 一定要小心谨慎的使用.
    njutree
        24
    njutree  
       2014-12-29 11:27:41 +08:00
    看到楼主问这个问题说明楼主对golang的同步编程模型还是有一定认识的,许大大说同步编程降低了我们的心智负担我觉得真的是这样。至于异步编程,在有些场景下是无法割舍的,不存在说投身golang就不学异步的思想了。
    alexapollo
        25
    alexapollo  
    OP
       2014-12-29 11:35:58 +08:00
    @semicircle21 为啥说闭包是坑啊?我一直觉得是个挺好用的特性
    semicircle21
        26
    semicircle21  
       2014-12-29 11:47:08 +08:00
    @alexapollo golang 的闭包是有坑的, 真的是.
    简单的说: golang capture 进来的变量是引用, 而不是拷贝的.
    这个概念我老是模糊, 现在也不是100%sure, 所以我又写了遍, 你看下:
    http://play.golang.org/p/_P0YELOj6N
    semicircle21
        27
    semicircle21  
       2014-12-29 11:55:56 +08:00
    semicircle21
        28
    semicircle21  
       2014-12-29 11:57:25 +08:00
    @alexapollo 日, 刚才那版错的, 看这里:
    http://play.golang.org/p/TgRDfV13hm
    xuyuanp
        29
    xuyuanp  
       2014-12-29 13:40:44 +08:00
    @semicircle21 这个有哪里不对吗?
    alexapollo
        30
    alexapollo  
    OP
       2014-12-29 14:17:03 +08:00
    @semicircle21 不是很理解为什么captured 10
    semicircle21
        31
    semicircle21  
       2014-12-29 14:35:34 +08:00
    @alexapollo
    @xuyuanp
    golang 闭包 "包"进来的 是 i 这个变量的"引用", 也就是说, 在 for 循环结束后, i = 10 了, 然后 go func() {} 那些才开始执行, 然后你就看到 captured 都是10了.
    其他语言里不是这样的, 是传值的, 或者是拷贝的. (至少对于 int 这样的基本类型不是)
    xuyuanp
        32
    xuyuanp  
       2014-12-29 15:32:42 +08:00
    @semicircle21 好吧。。。
    但是我觉得引用反而比较好,想拷贝的话,传参数就行
    如果本来就是拷贝,那想实现引用的效果反而会比较难
    alexapollo
        33
    alexapollo  
    OP
       2014-12-29 15:46:53 +08:00
    @semicircle21 那下面的传值函数是保留了十个上下文,在主函数结束循环后才开始启动吗?
    semicircle21
        34
    semicircle21  
       2014-12-29 16:14:52 +08:00
    @alexapollo
    可以理解为在循环结束后才开始的, golang 在调用函数传参时, 对 int 类型, 是拷贝的.
    semicircle21
        35
    semicircle21  
       2014-12-29 16:39:19 +08:00
    @xuyuanp http://play.golang.org/p/gAeiyN8mKe
    我新增了第三种, 只是新赋值了一个 c, 然后整个行为又不同了,
    也就是说 capture 的行为和 赋值 = 不一样, 与其他语言不同不是问题, 但这个真有点有悖惯性思维.
    我想不通为什么会这么设计.

    另外, 如果默认拷贝, 想实现引用的时候, &取地址就行了, golang 是有指针类型的.
    xuyuanp
        36
    xuyuanp  
       2014-12-29 17:06:48 +08:00
    @semicircle21
    可能是我对其他语言的闭包了解的不多
    学了go之后,一下子就接受了这个设定,毫无违和感。。。

    取地址这个我确实没想到。。。
    janxin
        37
    janxin  
       2014-12-29 18:37:55 +08:00
    @semicircle21 应该还是和golang的约定有关的,有点类似的还有slice的问题
    alexapollo
        38
    alexapollo  
    OP
       2014-12-29 18:50:08 +08:00
    @semicircle21 c此时相当于是拷贝,因为你var在这个临界区里,如果你var在外面,就还是引用的~
    alexapollo
        39
    alexapollo  
    OP
       2014-12-29 18:51:02 +08:00
    @semicircle21 看起来都是闭包的特性
    noli
        40
    noli  
       2014-12-29 21:51:16 +08:00
    @alexapollo 连 c++ coroutine 切换的性能损失都不能忍受,那你还用个毛线的 golang 啊?不会比 C++ 的更快了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3185 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:26 · PVG 20:26 · LAX 05:26 · JFK 08:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.