Golang 需要非同步嗎

分享创造 xuxu555 • at 2019-09-29 17:54:07 • 113 Views

前段時間,擼了個輪子 gev,主要就是基於 Reactor 模式的一個非阻塞 TCP 網路庫,直接操作 epoll 和 kqueue,沒有使用 net 標準庫。

優點就是快和記憶體佔用低,缺點就是 issue 裡這位大佬說的:

go 使用協程+阻塞的模式來處理併發問題。這樣的模式雖然對執行時要求很高,但對程式設計師卻非常友好。這樣的程式碼碼也非常容易維護。 非同步模式最大的問題就是回撥巢狀,專案大了根本沒法維護。我就是不想用回撥方式寫業務程式碼才轉 go 的。 你認為這類 go 語言的非同步框架有什麼優勢,要解決什麼問題?

Issue 裡有一些討論,肯定的、否定的都有。 Issue 連結: https://github.com/Allenxuxu/gev/issues/4

個人覺得,這種非同步庫作為特殊場景的補充還是有價值的,記憶體佔用低,速度也快,畢竟 Go 在 IOT 方面還是有很大希望的。也可能是因為我受 muduo 影響比較深,更加偏愛這種方式。。。

想聽聽大家怎麼看呢?


GitHub 地址: https://github.com/Allenxuxu/gev

吞吐量測試

image

詳細資訊,可以檢視倉庫 README https://github.com/Allenxuxu/gev

Total: 19
  • lhx2008 2019-09-28 21:09:09
    跑分比原生用 channel 快多少?网络这边都是用的 epoll 吧,不相信有太大差别。
  • xuxu555 2019-09-28 21:02:09
    @lhx2008 ping pong 测试 吞吐量差好多,你可以点到 readme 里看看
  • pubby 2019-09-28 21:09:09
    内存占用测试数据呢?

    如果没有数量级的差距,我还是偏向加机器
  • xuxu555 2019-09-28 21:10:09
    @pubby 这个我觉得不需要测啊,一个协程大约 4k, 主要就是节约协程
  • JRyan 2019-09-28 22:06:09
    如果考虑 goroutine 占用内存问题的话,可以考虑复用 goroutine,fasthttp 就是这么做的。
  • xuxu555 2019-09-28 22:07:09
    @JRyan go 都是阻塞读写,每个 tcp 连接都得分配两个 goroutine 给它。
    这个库是将 fd 注册到 epoll, 非阻塞读写
  • JRyan 2019-09-28 22:08:09
    go 的底层实际也是非阻塞的,基于 epoll 的,只是代码写起来是阻塞的,你这个库测试看起来比原生的好,主要还是因为连接使用的 goroutine 少,调度少,消耗的资源少。
  • xuxu555 2019-09-28 22:08:09
    @JRyan 是的,go 在 goroutine 调度上是通过锁来实现的,但是开发者可以阻塞读写,代码容易理解和维护。
  • linsijia1002 2019-09-28 23:05:16
    @JRyan go 底层是用 fd 阻塞读,不是用 epoll,你可以自己去看源码
  • sunny352787 2019-09-28 23:06:16
    看成本,是加程序员便宜还是加机器便宜,不过作为技术储备可以玩玩

    顺便,贴俩 github 地址
    https://github.com/smallnest/1m-go-tcp-server
    https://github.com/eranyanay/1m-go-websockets
  • sunny352787 2019-09-28 23:06:16
    epoll 模式只在 linux 下能用,如果开发环境是 win 或者 mac 的话就没戏,只能另做封装
  • xuxu555 2019-09-28 23:06:16
    @sunny352787 库里面也对 mac 作了支持的,使用 kqueue,主要是为了开发调试方便, 毕竟服务器基本都是 linux
  • sunny352787 2019-09-28 23:08:16
    @xuxu555 对,问题就在这,相当于维护了多套底层,可能开发时候没问题生产环境就坏了,另外 win 下更麻烦,而且在 win 下写代码的还是更多吧
  • sunny352787 2019-09-28 23:02:16
    @xuxu555 所以还是我上面说的,看成本,如果成本合得上那当然可以,不过多数时候还是老老实实用同步模式比较好
  • iPhoneXI 2019-09-28 23:06:16
    @sunny352787 Python 3 asyncio 就支持了 Windows 下的 Proactor Ioloop,
    相信其他网络库也不难,看开发者精力了
  • sunny352787 2019-09-29 00:05:16
    @iPhoneXI 就问一个问题,楼主的代码你敢不敢用在生产环境,这个级别的项目如果我用的话我肯定会吃透再用,这就不只是开发者精力问题了,使用者也会消耗很多精力,所以作为技术储备可以试试,但上线用的话还要斟酌
  • xuxu555 2019-09-29 02:00:48
    @sunny352787 为了支持多套环境,维护多套底层是必然的,标准库底层不同系统也是不同的。( win 写后端不多吧,我见多大多用 mac,虽然我自己电脑是 win。。。。。虚拟机装 Ubuntu )
  • xuxu555 2019-09-29 02:00:48
    @iPhoneXI win 环境下,计划用 std net 实现下,保持对外接口一致就好了,开发能调试。(毕竟服务器大多数是 Linux )
Add a reply
For Commenting you need to Login. If you dont have a Account you need to Register.