用Golang写网络库的一些想法

      用C/C++写网络库,比如muduo,实际上是在事件循环与线程承载之间综合考虑。可以将事件循环分为accept和IO处理两种。这两种事件循环可以放在单一线程,亦可以分开。当然,linux下的事件循环基本上就可以是reactor::epoll了。

      至于工作线程,则考虑计算量,可以使用线程池计算。也可以直接放在IO线程上。

      但对于golang,就不同了,最大的原因就是它的协程太轻量了,只要资源跟得上,随便开个几十万没事。而且go的net库封装了socket。

      func Dial(net, addr string) (Conn, error)//连接一个服务器

    func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err error)//在指定地址监听。

    func (l *TCPListener) Accept() (c Conn, err error)//接受一个连接

好吧。Dial函数用于主动连接,后面两个函数,用于被动连接(被动)。

首先,若连接数太大,在accept这里,可以综合考虑CPU线程数多开几个协程去accept。

当然,我们接下来需要做的,就是每到一个连接,就开一个协程去处理该连接。

至于工作线程,可以多开协程,或者直接在IO协程里面处理。

这么做或许可能有资源上的紧张,于是,折衷的办法还有在协程中调用C的代码,使用epoll。但何必呢?增加了复杂度。。。

记一些不成熟的想法。。。

 

你可能感兴趣的:(golang,网络库,muduo)