libevent

Libevent: how to close all open sockets on shutdown?

冷暖自知 提交于 2019-12-23 23:14:06
问题 I have created a simple HTTP proxy using libevent. It can be shutdown by sending it a SIGHUP signal which is caught by the signal handler. The shutdown function calls event_base_loopexit , frees structures and other heap allocations and exits. The problem is if a SIGHUP is caught when a connection is open. I need to be able to close the socket, ideally invoking the same close function that is called when a close event is caught. Is there a correct or standard way to do this? At the moment,

轻量级网络库libevent初探

一曲冷凌霜 提交于 2019-12-23 03:48:09
  本文是关于libevent库第一篇博文,主要由例子来说明如何利用该库。后续博文再深入研究该库原理。 libevent库简介   就如 libevent官网 上所写的“libevent - an event notification library”,libevent就是一个基于事件通知机制的库,支持/dev/poll、kqueue、event ports、select、poll和epoll事件机制,也因此它是一个跨操作系统的库(支持Linux、*BSD、Mac OS X、Solaris、Windows等)。目前应用该库的有Chromium、Memcached、NTP、tmux等应用。   libevent 库实际上没有更换select()、poll()或其他机制的基础,而是使用对于每个平台最高效的高性能解决方案,在其实现外加上一个包装器。   为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层 I/O 复杂性。这是 libevent 系统的核心。   libevent 库的其他组件提供其他功能,包括缓冲的事件系统(用于缓冲发送到客户端/从客户端接收的数据)以及 HTTP、DNS 和 RPC 系统的核心实现。   另外,libevent库非常轻量级,这让我们学习它的源码难度低了不少

libevent学习七(bufferevent)

眉间皱痕 提交于 2019-12-22 14:34:36
1. 每个bufferevent 都拥有类型为struct evbuffer的input buffer和out buffer,分别供数据读取和数据写入使用。 2.读取和写入数据是通过编写和设置对应的回调函数进行,而调用回调函数的时机则根据水位是否满足来的,水位又是可以设置的。默认情况下读的低水位是0,就是说libevent从底层读到大于0的数据到input buffer中,读回调函数就会调用,读回调函数读取input buffer的数据;同样默认的写水位也为0,就是说一旦output buffer中没有数据,就会调用写回调函数写入数据到output buffer,ouput buffer会自动由libevent传出到对端。 3.bufferevent 除了有读写事件还有其他事件 BEV_EVENT_READING:读过程中发生的事件 BEV_EVENT_WRITING :写过程中发生的事件 BEV_EVENT_ERROR:操作过程中发生的事件 BEV_EVENT_TIMEOUT:超时事件 BEV_EVENT_EOF:到达文件末尾 BEV_EVENT_CONNECTED:连接成功事件 4.bufferevent的选项 BEV_OPT_CLOSE_ON_FREE:释放bufferevent的时候释放掉底层的socket和底层的bufferevent BEV_OPT_THREADSAFE

Async Redis pooling using libevent

荒凉一梦 提交于 2019-12-22 08:22:21
问题 I want get as much as possible from Redis + Hiredis + libevent. I'm using following code (without any checks to be short) #include <stdlib.h> #include <event2/event.h> #include <event2/http.h> #include <event2/buffer.h> #include <hiredis/hiredis.h> #include <hiredis/async.h> #include <hiredis/adapters/libevent.h> typedef struct reqData { struct evhttp_request* req; struct evbuffer* buf; } reqData; struct event_base* base; redisAsyncContext* c; void get_cb(redisAsyncContext* context, void* r,

Is there a Java equivalent to libevent?

此生再无相见时 提交于 2019-12-22 06:49:13
问题 I've written a high-throughput server that handles each request in its own thread. For requests coming in it is occasionally necessary to do RPCs to one or more back-ends. These back-end RPCs are handled by a separate queue and thread-pool, which provides some bounding on the number of threads created and the maximum number of connections to the back-end (it does some caching to reuse clients and save the overhead of constantly creating connections). Having done all this, though, I'm

memcached 源码阅读笔记

允我心安 提交于 2019-12-21 23:28:15
阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO 事件. 个人认为, 阅读源码的起初最忌钻牛角尖, 如头文件里天花乱坠的结构体到底有什么用. 源文件里稀里哗啦的函数是做什么的. 刚开始并没必要事无巨细弄清楚头文件每个类型定义的具体用途; 很可能那些是不紧要的工具函数, 知道他的功能和用法就没他事了. 来看 memcached 内部做了什么事情. memcached 是用 c 语言实现, 必须有一个入口函数 main() , memcached 的生命从这里开始. 初始化过程 建立并初始化 main_base, 即主线程的事件中心, 这是 libevent 里面的概念, 可以把它理解为事件分发中心. 建立并初始化 memcached 内部容器数据结构. 建立并初始化空闲连接结构体数组. 建立并初始化线程结构数组, 指定每个线程的入口函数是 worker_libevent() , 并创建工作线程. 从 worder_libevent() 的实现来看, 工作线程都会调用 event_base_loop() 进入自己的事件循环. 根据 memcached 配置, 开启以下两种服务模式中的一种: 以 UNIX 域套接字的方式接受客户的请求 以

Memcached学习(一)--网络模型

眉间皱痕 提交于 2019-12-21 07:12:00
1、Memcached的网络模型   Memcached的网络模型是基于Libevent网络库开发的,同时Memcached采用多线程的工作方式,工作线程和主线程之间采用pipe进行通信。Memcached的网络线程模型主要涉及两个主要文件: memcached.c 和 thread.c 文件。 Memcached的网络模型流程大致如下: 1、memcached会在main函数中创建主线程的event_base,将监听端口的socket注册到主线程的event_base,由主线程来监听和接受客户端连接。 2、main函数创建主线程的同时,也会创建N个工作线程,每个工作线程都拥有各自的event_base 和LIBEVENT_THREAD数据结构来存储线程的信息(线程基本信息、线程队列、pipe文件描述符)。工作线程会将pipe管道的接收端 fd 注册到自己的event_base。 3、当有新连接建立时,主线程会通过accept 函数来与客户端建立新连接,同时将新连接相关的信息填入CQ_ITEM结构并放入工作线程的conn_queue队列,同时向选定的工作线程的管道写入字符,以此触发工作线程的libevent事件。 4、主线程是通过求余数的方式来选择线程池中的一个工作线程,工作线程得到通知后,会从conn_queue队列中取出CQ_ITEM

Envoy源码分析之Dispatcher

这一生的挚爱 提交于 2019-12-19 07:51:05
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Dispatcher 在Envoy的代码中 Dispatcher 是随处可见的,可以说在Envoy中有着举足轻重的地位,一个 Dispatcher 就是一个 EventLoop ,其承担了任务队列、网络事件处理、定时器、信号处理等核心功能。在 Envoy threading model 这篇文章所提到的 EventLoop ( Each worker thread runs a “non-blocking” event loop )指的就是这个 Dispatcher 对象。这个部分的代码相对较独立,和其他模块耦合也比较少,但重要性却不言而喻。下面是与 Dispatcher 相关的类图,在接下来会对其中的关键概念进行介绍。 Dispatcher 和 Libevent Dispatcher 本质上就是一个 EventLoop ,Envoy并没有重新实现,而是复用了Libevent中的 event_base ,在Libevent的基础上进行了二次封装并抽象出一些事件类,比如 FileEvent 、 SignalEvent 、 Timer 等。Libevent是一个C库,而Envoy是C++,为了避免手动管理这些C结构的内存,Envoy通过继承 unique_ptr 的方式重新封装了这些libevent暴露出来的C结构

memcache 安装

青春壹個敷衍的年華 提交于 2019-12-18 13:20:17
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 注意:一些安装路径要保持 cd /home/cache tar zxvf memcached-1.5.20.tar.gz tar zxvf libevent-2.1.11-stable.tar.gz #安装libevent cd libevent-2.1.11-stable ./configure --prefix= /home/libevent_tp/libevent-2.1.11-stable make make install #安装memcache cd /home/blue/memcached-1.5.20 ./configure --prefix=/home/cache/memcached-1.5.20 --with-libevent= /home/libevent_tp/libevent-2.1.11-stable make make install 来源: oschina 链接: https://my.oschina.net/u/2485543/blog/3144393

Memcached内存数据库群集

匆匆过客 提交于 2019-12-18 08:57:30
Memcached概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网址访问的速度 Memcached缓存机制 当程序写入缓存数据请求时,Memcached的API接口将KEY输入路由算法模块路由到集群中的一台服务,之后由API接口与服务器进行通信,完成一次分布式缓存写入 Key索引建立在API中,值value数据存在后面的memcached中 Memcached分布式 要依赖于Memcached的客户端来实现 多个Memcached服务器是独立的 分布式数据如何存储是路由算法所决定 Memcached路由算法 求余数hash算法 先用key做hash运算的到一个整数,再去做hash算法,根据余数进行路由。不适合在动态变化的环境中 一致性hash算法 按照hash算法把对应key通过一定hash算法处理后映射形成一个首尾接闭合循环,然后通过使用与对象存储一样的hash算法将机器也映射到环中,顺时针方向计算将所有对象存储到离自己最近的机器中。适合在动态变化中使用 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解