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

Go 语言的并发模型跟 libev libuv 之类的差别大吗?

  •  
  •   yjsslab · 2015-04-19 15:37:35 +08:00 · 2782 次点击
    这是一个创建于 3506 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求科普

    17 条回复    2015-04-20 19:20:30 +08:00
    aszxqw
        1
    aszxqw  
       2015-04-19 18:01:37 +08:00
    差别很大。

    1. 协程是更好的高并发解决方案,无须回调函数。[谈谈并发编程中的协程](http://yanyiwu.com/work/2014/12/20/c-coroutine.html)
    2. libev 和 libuv 不是很熟悉,印象中是和libevent差不多的异步解决方案,主要是回调的弊端严重。
    3. go的并发就是使用协程这个解决方案。

    具体可以从 fibjs 和 nodejs 的对比中就可见一斑。
    aszxqw
        2
    aszxqw  
       2015-04-19 18:04:09 +08:00
    再帖几个之前写的相关博文链接,楼主有兴趣可以看看

    C1000K之Libevent源码分析: http://yanyiwu.com/work/2014/12/10/asyncronous-io-libevent.html
    由NodeJieba谈谈Node.js异步实现: http://yanyiwu.com/work/2015/03/21/nodejs-asynchronous-insight.html
    billzhuang
        3
    billzhuang  
       2015-04-19 18:53:49 +08:00 via iPhone
    异步编程的观点是,不是cpu的操作不要占着线程,因为线程创建和切换比较重。
    Go的goroutine 创建好像才2Kb空间,切换也飞速,所以不需要考虑省“线程”的问题。
    hitsmaxft
        4
    hitsmaxft  
       2015-04-19 19:12:19 +08:00 via iPhone
    go提供的goroutine是基于csp模型的。

    libuv之类的是一个低级的异步io库,要处理并发还得在它的api之上构建一层你所谓的并发模型。
    一个是语言级别的并发编程方案,一个是io库,不在一个坐标系上。

    计算机科学嘛,包装几层之后就变成别的东西了。
    zhicheng
        5
    zhicheng  
       2015-04-19 19:48:07 +08:00 via Android
    一样的,你记住一点,用户态的任何技术,都逃不过内核提供的接口。另外,楼上的同学,没有C1000K一说,这个叫C1M。当然气势差了些。
    reusFork
        6
    reusFork  
       2015-04-19 20:00:05 +08:00
    go运行时实现网络io的方法和libev / libuv是一样的。但是go程序写起来是不需要回调的,都是同步风格的代码。所以从C程序和go程序的角度看,是不一样的。
    est
        7
    est  
       2015-04-19 20:12:40 +08:00
    @zhicheng 已经有用户态的TCP/IP栈了。跑满网卡没问题
    choury
        8
    choury  
       2015-04-19 20:22:18 +08:00
    @est 那也不可能直接越过操作系统操作网卡吧
    missdeer
        9
    missdeer  
       2015-04-19 20:55:03 +08:00
    1楼和6楼合起来就是lz想知道的
    shangjiyu
        10
    shangjiyu  
       2015-04-19 21:09:46 +08:00
    @zhicheng 貌似直接内置网卡驱动,绕过内核的包快速处理 kit
    http://dpdk.org/
    http://www.ntop.org/products/pf_ring/
    https://github.com/SnabbCo/snabbswitch
    clino
        11
    clino  
       2015-04-19 22:04:08 +08:00
    @zhicheng 去google C1M 没出来什么相关的东西,但是 C1000K 有相关结果
    zhicheng
        12
    zhicheng  
       2015-04-19 22:22:47 +08:00 via Android
    @esp 只用 socket 也能把网卡跑满。
    我搜了C1000K,结果都是中国人的项目。你搜不到 C1M 是因为你的姿势不对,你要搜 C1M problem。
    denghongcai
        13
    denghongcai  
       2015-04-19 22:28:17 +08:00
    @zhicheng C1M同样也是没搜到的,Google
    这样的名称本来就是看谁多占优
    YouXia
        14
    YouXia  
       2015-04-19 22:53:06 +08:00 via Android
    lidashuang
        15
    lidashuang  
       2015-04-20 11:59:50 +08:00
    monnand
        16
    monnand  
       2015-04-20 18:14:17 +08:00 via Android
    @zhicheng 不是C1M,是C10。http://c10m.robertgraham.com 基本思路是在用户空间内实现协议栈,利用虚拟内存来克服内核空间内物理内存的限制
    zhicheng
        17
    zhicheng  
       2015-04-20 19:20:30 +08:00 via Android
    @monnand 你们开心就好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   958 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:00 · PVG 05:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.