ZLToolKit网络库的自问自答

使用epoll+线程池+异步网络IO模式开发。

1 一个线程一个epoll,还是共用1个epoll ?

 一个线程一个epoll。

一台服务器的IO事件不是固定的吗?为了更快的处理完IO事件。

2 IO多路复用定义:1个线程处理多个IO事件。

EventPoller为什么需要管道写1字节唤醒呢?切换线程

但epoll_wait有超时时间啊?

在ZLToolKit中:

用户操作比如EventPoller::addEvent。假设EventPoller属于线程1,在线程2调用了addEvent。

addEvent:在当前线程,放到_event_map。不是当前线程,async。

async_l:把回调指针放入_list_task,写一字节数据,_pipe.write("", 1);。在线程2中。

在线程1中:EventPoller::onPipeEvent()会读到数据,执行_list_task的回调,回调到线程1的addEvent

开始没明白为什么能切换到线程1?_pipe.write是线程1的EventPoller的成员变量。)

runLoop:epoll_wait返回了,判断_event_map是否有该IO事件,如果有就回调。

扩展:什么时候会跨线程?

4 work poller:用于阻塞式dns解析,connect 域名不是ip。

work poller线程个数太多了,是cpu的个数。

在线程间调配负载 ?

6 ioctl设置非阻塞,对那些函数起作用?非阻塞等于异步吗?

ioctl(sock, FIONBIO, &ul); 对int socket。

只影响accept/connect、recv、send,不影响select,epoll_wait,后面2个函数参数带超时参数。

非阻塞不等于异步,但大部分使用场景都是异步的。

7 tcp server支持多线程如何实现?

下面是wiki的原文:

在创建一个TcpServer时,ZLMediaKit会把这个Tcp服务的监听套接字加入到每一个epoll实例,这样如果收到新的RTMP播放请求,那么多个epoll实例会在内核的调度下,自动选择负载较轻的线程触发accept事件。

不是每个EventPoller线程,调用listen函数,而是把listen fd添加到epoll_ctl,EPOLL_CTL_ADD为了提高性能?

TCP Server创建在EventPoller 1,accept后,假设返回在了EventPoller 2?(因为每个EventPoller线程都监听这个listen fd)如何处理?

答:给其它EventPoller线程也创建了TcpServer。

这样还存在其它问题吗?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值