求科普
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 的对比中就可见一斑。 |
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 |
3
billzhuang 2015-04-19 18:53:49 +08:00 via iPhone
异步编程的观点是,不是cpu的操作不要占着线程,因为线程创建和切换比较重。
Go的goroutine 创建好像才2Kb空间,切换也飞速,所以不需要考虑省“线程”的问题。 |
4
hitsmaxft 2015-04-19 19:12:19 +08:00 via iPhone
go提供的goroutine是基于csp模型的。
libuv之类的是一个低级的异步io库,要处理并发还得在它的api之上构建一层你所谓的并发模型。 一个是语言级别的并发编程方案,一个是io库,不在一个坐标系上。 计算机科学嘛,包装几层之后就变成别的东西了。 |
5
zhicheng 2015-04-19 19:48:07 +08:00 via Android
一样的,你记住一点,用户态的任何技术,都逃不过内核提供的接口。另外,楼上的同学,没有C1000K一说,这个叫C1M。当然气势差了些。
|
6
reusFork 2015-04-19 20:00:05 +08:00
go运行时实现网络io的方法和libev / libuv是一样的。但是go程序写起来是不需要回调的,都是同步风格的代码。所以从C程序和go程序的角度看,是不一样的。
|
9
missdeer 2015-04-19 20:55:03 +08:00
1楼和6楼合起来就是lz想知道的
|
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 |
12
zhicheng 2015-04-19 22:22:47 +08:00 via Android
@esp 只用 socket 也能把网卡跑满。
我搜了C1000K,结果都是中国人的项目。你搜不到 C1M 是因为你的姿势不对,你要搜 C1M problem。 |
13
denghongcai 2015-04-19 22:28:17 +08:00
@zhicheng C1M同样也是没搜到的,Google
这样的名称本来就是看谁多占优 |
14
YouXia 2015-04-19 22:53:06 +08:00 via Android
|
15
lidashuang 2015-04-20 11:59:50 +08:00
@billzhuang 8k
|
16
monnand 2015-04-20 18:14:17 +08:00 via Android
@zhicheng 不是C1M,是C10。http://c10m.robertgraham.com 基本思路是在用户空间内实现协议栈,利用虚拟内存来克服内核空间内物理内存的限制
|