V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
matrix67
V2EX  ›  Go 编程语言

感觉引入了 chan 后, go 测序的阅读不是那么线性

  •  
  •   matrix67 · 2021-09-29 14:34:31 +08:00 · 3523 次点击
    这是一个创建于 1152 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个不一定对,只是我的一个感觉。

    举个例子,https://github.com/rissw/not_yet_hit_the_wall/blob/main/03-blockread-concurrent/blockread-concurrent.go 这个作者使用并行的方式去统计大文件里面的行数,速度的确很快,几乎和 wc -l 差不多。

    但是理解起来真是费劲,比 00-readfile 串行读取统计难度高许多。(但是也快很多,几十倍吧)

    后来我一边阅读一边画图才理顺了。感觉 go 的程序需要配个图理解一下啊。

    blockread.png

    (画图的时候把变量名也重构了一下更符合自己的理解,可能和源程序的命名稍有不同,大致结构是一样的)

    19 条回复    2021-10-04 12:24:26 +08:00
    MiniGhost
        1
    MiniGhost  
       2021-09-29 14:40:46 +08:00
    chan 的阅读性跟 goto 一样,是会降低代码阅读性

    但是好在 chan 场景有限,不像 goto 真的想用可以搞的飞起...
    TuringHero
        2
    TuringHero  
       2021-09-29 14:54:36 +08:00
    图用啥画的
    INCerry
        3
    INCerry  
       2021-09-29 15:59:56 +08:00
    所以我用 C# 感觉 await async 那样阅读更方便 上下文逻辑也不会割裂
    gfreezy
        4
    gfreezy  
       2021-09-29 16:05:06 +08:00
    count 改成用 atomicInt 可以省掉个 chan
    gfreezy
        5
    gfreezy  
       2021-09-29 16:06:16 +08:00
    如果要安全的关闭 chan 会更加恶心,会有各种依赖死锁
    statumer
        6
    statumer  
       2021-09-29 16:10:37 +08:00 via Android   ❤️ 2
    go-zero 里有个 mapreduce 组件,可以了解一下看看是不是你想要的 https://gocn.vip/topics/10941
    chendy
        7
    chendy  
       2021-09-29 16:13:00 +08:00
    楼主这个图画得真好,是用啥工具画的啊?
    join
        8
    join  
       2021-09-29 16:15:48 +08:00 via iPhone
    用一个 chan 就好了,没必要三个。count 可以按楼上说的用 atomic value
    matrix67
        9
    matrix67  
    OP
       2021-09-29 16:22:12 +08:00   ❤️ 3
    @chendy #7
    @TuringHero #2

    visio
    Reficul
        10
    Reficul  
       2021-09-29 17:21:38 +08:00
    看到过 chan chan chan 的,选择死亡
    lysS
        11
    lysS  
       2021-09-29 17:32:43 +08:00
    你那是没见过 channel 嵌套,真是难为编辑器了
    index90
        12
    index90  
       2021-09-29 18:12:54 +08:00
    chan:这锅我不背
    lishunan246
        13
    lishunan246  
       2021-09-29 18:35:22 +08:00 via Android
    那么是 go 的代码好读还是 wc 的好读呢
    matrix67
        14
    matrix67  
    OP
       2021-09-29 18:43:35 +08:00
    @gfreezy #4
    @join #8

    确实,我是在研究这一系列文章的时候 https://marcellanz.com/post/file-read-challenge/ 看到了现在这个 repo 的。之前这篇写的蛮好的,确实有减少 chan,内存优化等等之类的技巧。

    1. https://boyter.org/posts/file-read-challange/
    2. Using Java to Read Really, Really Large Files
    3. Processing Large Files in Java
    4. Processing Large Files – Java, Go and ‘hitting the wall’

    https://github.com/vietvudanh/really-large-file python rust go java scala
    https://github.com/rissw/not_yet_hit_the_wall


    @lysS #11 是啊 ,这种代码咋读,自己写的还好,看别人写的真是一脸懵逼。
    gfreezy
        15
    gfreezy  
       2021-09-29 20:36:18 +08:00
    正常情况下也不会这样写代码。如果提前取一下文件大小,然后直接分配下每个线程负责的 offset,然后多线程每个线程各自打开文件,seek 到 offset,用 SIMD 找换行符,性能应该还能更快。
    darrh00
        16
    darrh00  
       2021-09-29 21:26:52 +08:00
    虽然是 Go 的拥趸,但是还真是觉得 chan 的设计就是一坨排泄物,即使一个老手要用好 chan 也难上加难。
    一些入门读物都会喜欢用 CSP 这种高大上的词汇来吓唬人。。
    最神奇的设计就是,向已经关闭的 chan 发送数据会导致 panic,别跟我提背后的设计理由,我都读了无数遍了。
    本来能在底层暴露一个简单的借口,导致为了写安全的代码,代码越写越难看,理解起来越费劲。
    dickinpit
        17
    dickinpit  
       2021-09-29 23:41:42 +08:00
    等会儿,楼主你这 ID 有来头啊
    TypeError
        18
    TypeError  
       2021-09-30 00:05:48 +08:00 via Android
    @darrh00 对啊,还不如学其他语言的 queue,多加了一堆概念,好处却没增加多少
    lesismal
        19
    lesismal  
       2021-10-04 12:24:26 +08:00
    @darrh00 你要考虑,如果是 c/cpp 那些,要自己写信号量 /条件量+queue,虽然也是简单的玩意,但对于逻辑程序员占 80%的程序员群体中的这大部分人,已经是一道天堑鸿沟了,chan 可以让你直接拿来就用了。

    稍微复杂点的功能都可能需要去处理并发相关的事情,真的不算事。所以你说的缺点,可能对于长期做 web 接口开发 CURD 人员来说,确实是难了点。如果都是按照 CURD 的标准来要求开发者,那很多基础设施类的东西都没几个人能做了。即使是其他语言很方便,但承担造轮子任务的人仍然要面对大量的复杂。

    chan 的这点复杂,应该是自己级别飞升时必须克服的一道基本功修炼流程,而不是被这么点复杂把自己逼在舒适区里只靠业务经验提高履历含金量。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6038 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:50 · PVG 10:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.