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

发布于 1周前 作者 yibo5220 来自 Go语言

求科普


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

差别很大。

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

具体可以从 fibjs 和 nodejs 的对比中就可见一斑。

更多关于Golang Go语言的并发模型跟 libev libuv 之类的差别大吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


再帖几个之前写的相关博文链接,楼主有兴趣可以看看

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

异步编程的观点是,不是cpu的操作不要占着线程,因为线程创建和切换比较重。
Go的goroutine 创建好像才2Kb空间,切换也飞速,所以不需要考虑省“线程”的问题。

go提供的goroutine是基于csp模型的。

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

计算机科学嘛,包装几层之后就变成别的东西了。

一样的,你记住一点,用户态的任何技术,都逃不过内核提供的接口。另外,楼上的同学,没有C1000K一说,这个叫C1M。当然气势差了些。

go运行时实现网络io的方法和libev / libuv是一样的。但是go程序写起来是不需要回调的,都是同步风格的代码。所以从C程序和go程序的角度看,是不一样的。

已经有用户态的TCP/IP栈了。跑满网卡没问题

那也不可能直接越过操作系统操作网卡吧

1楼和6楼合起来就是lz想知道的

去google C1M 没出来什么相关的东西,但是 C1000K 有相关结果

只用 socket 也能把网卡跑满。
我搜了C1000K,结果都是中国人的项目。你搜不到 C1M 是因为你的姿势不对,你要搜 C1M problem。

C1M同样也是没搜到的,Google
这样的名称本来就是看谁多占优

不是C1M,是C10。http://c10m.robertgraham.com 基本思路是在用户空间内实现协议栈,利用虚拟内存来克服内核空间内物理内存的限制

你们开心就好。

Golang的并发模型与libev、libuv等网络库在实现和设计理念上存在显著差异。

Golang的并发模型以goroutine和channel为核心。Goroutine是轻量级的线程,由用户态的调度器管理,避免了内核态的线程切换开销。Channel则用于goroutine间的通信,支持同步和异步的消息传递。这种模型使得Golang能够高效地处理并发任务,特别是在I/O密集型场景下表现优异。

相比之下,libev和libuv是事件驱动的网络库,主要用于处理网络I/O。它们提供了异步的事件循环和回调函数机制,使得开发者能够编写出高效且可扩展的网络应用程序。然而,这些库并不直接提供像Golang那样的并发模型,而是需要开发者在事件回调中管理并发逻辑。

因此,虽然libev、libuv等网络库也支持并发处理,但它们的并发模型更侧重于网络I/O的异步处理,而Golang的并发模型则是一种更为通用和高效的并发处理方式,两者在应用场景和实现细节上有所不同。

回到顶部