libevent实现多线程

libevent并不是线程安全的,但这不代表libevent不支持多线程模式。

前几天在微博上看到ruanyf发了条微博说到apache和nginx的并发模型,看到评论很多人都说不对

于是自己又查了下,总结一下我所学过的网络库或者网络服务器的并发模型

1、muduo:one loop per thread,主线程注册listen事件,通过某种负载均衡机制(round robin)将连接的事件注册到子线程的Reactor上,据说也是Netty的方案,最近也正好在学netty,刚好可以验证一下。

另外,muduo还提到了一个runInLoop()的功能:如果用户在当前线程调用,则回调functor会同步进行,如果在其他线程调用,则IO线程会被唤醒执行这个functor。这种跨线程调用是如何实现的?因为其他线程很可能阻塞在Reactor上。传统方法是用pipe(后面将提到memcache的多线程),在muduo里面是用eventfde(2),将回调放入线程的任务队列,并发送一个uint64大小的消息来唤醒Reactor。

2、nginx:master + worker的工作模式,ruanyf的微博说是master接受连接分配给worker,事实上不是这样的,master只是通过信号管理worker进程,worker之间通过accept_mutex来决定是否将监听套接字加入到loop中。所谓的one loop per process

3、libevent:这是在网上找的资料,libevent并不是线程安全,但不代表其不支持多线程。memcache的网络部分使用libevent,有一个经典的图描述了其多线程实现:

这里写图片描述

这种消息通知+同步层的机制,通过pipe和一个加锁的任务队列(CQ)实现。与muduo的eventfd效果类似。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libevent是一个开源的事件驱动库,可以用于开发高性能的多线程服务器架构。它提供了一组API,可以处理各种事件,如网络连接、定时器和信号等。以下是一个基本的libevent多线程服务器架构的示例: 1. 初始化libevent库:在服务器启动时,首先需要初始化libevent库,并创建一个libevent的上下文对象。 2. 创建监听socket:使用libevent提供的API创建一个监听socket,用于接收客户端的连接请求。 3. 注册事件回调函数:通过使用libevent提供的API,将监听socket的读事件(即有新的连接请求)注册到libevent的事件循环中,并指定对应的回调函数。 4. 创建工作线程池:为了处理多个客户端连接,可以创建一个工作线程池。每个工作线程都负责处理一个或多个客户端连接。 5. 接收客户端连接:当有新的客户端连接请求到达时,libevent会触发注册的回调函数。在回调函数中,可以接受客户端连接,创建新的套接字,并将其注册到libevent的事件循环中。 6. 分发工作:当新的客户端连接被接受后,可以选择将其分发给工作线程池中的某个线程进行处理。可以使用线程池管理库或手动实现线程池。 7. 处理客户端请求:在工作线程中,可以通过libevent的事件循环处理客户端的读写事件。可以注册读事件来接收客户端发送的数据,注册写事件来发送响应数据。 8. 关闭连接:当客户端断开连接或发生错误时,需要关闭对应的套接字,并从libevent的事件循环中移除。 以上是一个简单的libevent多线程服务器架构的基本步骤。实际应用中,还可以结合其他技术和设计模式来实现更复杂的功能和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值