scribe安装与使用
Scribe的安装与使用指南
要安装Thrift依赖,首先确保已安装以下软件:g++,剖析 boost, autoconf, libevent, Apache ant, JDK, PHP, 和python。其他脚本语言根据需要自行安装。源码 安装Thrift的深度步骤如下:参照扩展阅读~中的说明进行安装流程。
在thrift源代码目录下的剖析31855源码tutorial目录中,使用`thrift -r –gen cpp tutorial.thrift`命令生成服务代码,源码包括对include文件的深度处理。
生成的剖析代码会存放在gen-cpp目录下,接着切换到tutorial/cpp目录,源码执行`make`生成CppServer与CppClient。深度
运行这两个程序,剖析确保它们能成功通信。源码
如果Hadoop自带的深度libhdfs不可用,可以按照以下步骤编译:在Hadoop根目录下输入`ant compile-c++-libhdfs -Dislibhdfs=true`,剖析并配置HADOOP_HOME的CLASSPATH。 安装Scribe的步骤包括运行bootstrap脚本(参见扩展阅读)。可能遇到的错误及解决方法如下:当Boost不在默认目录时,配置命令如下:`./configure –with-boost=/usr/local/boost –prefix=/usr/local/scribe`。
如果运行examples时出现`ImportError: No module named scribe`,可能需要添加Python路径,如:`$export PYTHONPATH="/usr/lib/python2.6/site-packages/"`。
遇到`java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration`异常,需将Hadoop的classpath添加到环境变量中,如:`$export CLASSPATH=$HADOOP_HOME/hadoop-core-0..2+.jar[2]`。
安装完成后,可以参考扩展阅读8中的方法验证安装是否成功。libevent、libev框架介绍
本文深入讲解了libevent的API,并剖析了libevent的evbuffer源码。libevent、libev和libuv都是C语言实现的异步事件库,主要负责注册异步事件、检测异步事件,fusionapp源码投屏并根据事件的触发先后顺序调用相应的回调函数处理事件。这些事件包括网络I/O事件、定时事件以及信号事件,共同驱动服务器运行。
libevent和libev主要封装了与操作系统交互的简单事件管理接口,让开发者无需关注平台差异,只需处理事件的具体逻辑。libev改进了libevent的架构决策,如消除全局变量的使用,采用回调函数传递上下文,构建不同的数据结构以降低事件耦合性,使用最小四叉堆作为计时器,从而实现高效管理。然而,libevent和libev在window平台的支持较差,因此libuv应运而生,基于libev,尤其在window平台上更好地封装了iocp,node.js即基于libuv。
在libevent的编译安装过程中,首先从git下载release-2.1.-stable.tar.gz,然后在编译程序时指定库名:-levent。由于头文件和库文件已经复制至系统路径,因此在编译时无需额外指定-I和-L。
libevent的封装层次分为网络封装和解决的问题。网络封装包括IO检测和IO操作,解决的问题涉及连接建立(如最大连接数、黑白名单等)和连接断开,以及数据的到达与发送。如果不想手动操作IO事件,libevent会管理读写I/O处理,使开发者只需处理逻辑,无需关心边界问题。运行状态源码
libevent提供了事件检测与操作的封装。事件检测是低层封装,由libevent负责,用户自定义IO操作。该层次封装了事件管理器操作和事件接口。事件管理器event_base用于构建事件集合,检测事件就绪情况。释放管理器使用event_base_free,event_reinit用于重置,event_get_supported_methods查看支持的方法。
事件循环通过event_base_dispatch和event_base_loop实现,等待事件产生,提供类似epoll红黑树循环的功能。事件循环终止使用event_base_loopbreak和event_base_loopexit,前者在事件回调执行后终止,后者立即终止。
事件对象通过event_new创建,event_free销毁。注册与注销事件使用event_add和event_del,事件驱动的核心思想是libevent的核心功能。
libevent事件对象包括只使用事件检测、IO操作自处理的Demo。此外,自带缓冲的事件-bufferevent介绍其作为event的高级版本,拥有两个缓冲区和三个回调函数,分别用于读取、写入和事件处理。
bufferevent提供读写数据到缓冲区的封装,三个回调函数分别处理读取、写入和事件触发。构建、销毁bufferevent对象,以及连接操作、海盗来了源码分析设置回调等。
事件类型注册与注销使用bufferevent_enable/disable,获取读写缓冲区使用bufferevent_get_input和bufferevent_get_output,数据分割使用evbuffer_readln和固定长度读取使用evbuffer_remove。
对于bufferevent,一个文件描述符对应两个缓冲区和三个回调函数,文件描述符用于与客户端通信,非监听文件描述符。两个缓冲区指读缓冲区和写缓冲区,三个回调分别对应读操作、写操作和事件触发。
链接监听器-evconnlistener封装底层socket通信函数,如socket、bind、listen、accept。创建监听器后,等待新客户端连接,调用用户指定的回调函数。构建监听器使用evconnlistener_new_bind,回调函数evconnlistener_cb接收与客户端通信的描述符和连接对端地址。
信号事件在libevent中与网络事件相似,通过epoll监听。定时事件和网络事件的处理机制基于最小堆与epoll_wait,通过源码分析可深入了解流程。
evbuffer作为libevent底层实现的链式缓冲区,用于bufferevent事件中的数据读写。每个evbuffer由链表组成,包含关键成员和实现细节。evbuffer的优点在于高效处理数据移动和内存浪费,缺点是数据在不连续内存中存储,可能导致多次io。libev关注具体网络IO事件、推荐商品的源码定时事件和信号事件,提供API如ev_io_init、ev_io_start、ev_timer_start和ev_run。通过libev宏定义封装,开发者能使用与libevent类似的接口。
网络I/O库总结(libevent,libuv,libev,libeio)
Libevent
Libevent 是一个基于事件驱动模型的非阻塞网络库,用于构建高速、可移植的非阻塞 IO 应用。广泛应用于 memcached、Vomit、Nylon、Netchat 等项目中,作为底层网络库,用于实现 TCP 或 HTTP 服务。Libevent 的 GitHub 源码可访问。
Libev
Libev 是由 Marc Lehmann 独立完成的,对不同系统非阻塞模型进行简单封装,解决了不同 API 之间的不兼容问题,保证程序在大多数 *nix 平台上运行。Libev 支持类 UNIX 系统的多种 I/O 多路复用模型,如 select、poll、epoll、kqueue、evports 等,但对于 Windows 的支持仅限于 select 模型,效率较低,性能不如 Libuv 封装的 IOCP。Libev 目标是修复 Libevent 的一些设计问题,如避免使用全局变量,提供更高效的事件类型管理。
Libuv
Libuv 是一个跨平台、高性能、事件驱动的异步 IO 库,用 C 语言编写,封装了不同平台底层的高性能 IO 模型,如 epoll、kqueue、IOCP、event ports,具有高度可移植性。Libuv 为 Node.js 设计,但因其高效模型逐渐被其他语言和项目采纳,用于底层库,如 Luvit、Julia、uvloop、pyuv 等。
Libevent、Libev、Libuv 比较
根据 GitHub 星标数,Libuv 的影响力最大,其次是 Libevent,Libev 关注较少。在优先级、事件循环、线程安全等方面,Libuv 更为现代,支持多种平台和 IO 模型,提供了更优的性能和功能。Libevent 和 Libev 分别针对不同平台和需求进行优化,Libev 旨在修复 Libevent 的问题。性能和可移植性方面,Libuv 优于 Libevent 和 Libev。
异步 IO 实现
目前 Linux 异步 IO 实现有原生异步 IO 和多线程模拟异步 IO 两种方式。原生异步 IO 支持特定场景,但不充分利用 Page cache;多线程模拟异步 IO 方式如 Glibc AIO、libeio、io_uring 等,提供更广泛的适用场景。
全网最详细的Libevent网络库总结(上)
深入解析Libevent:高性能I/O框架的精髓 Libevent作为开源界的瑰宝,凭借其轻量级、高效能的Reactor模式,为异步编程提供了强大支持。它以事件驱动为核心,构建了一套统一处理事件、信号和定时的框架,确保了快速响应和简单编程。让我们一起探索其核心组件和工作流程。 1. Libevent的使用步骤首先,通过event_init()创建事件基础结构event_base,这是整个事件处理的基石。
接下来,利用evsignal_new()或evtimer_new()创建事件处理器,返回事件实例。
通过event_add()将处理器添加到事件队列和多路复用器,这一步将事件与事件基础关联起来。
启动事件循环,通过event_base_dispatch()持续监听事件。
当循环结束后,别忘了释放系统资源,确保资源的正确管理。
2. 事件处理流程详解 事件处理始于应用初始化,设置事件类型和回调函数。接着,事件源被注册,定时事件通过小根堆管理,I/O事件则加入等待链表。事件基础循环持续等待事件,检查超时和I/O事件的发生。 3. 源代码结构与组织 Libevent的源代码分为多个模块,包括事件接口的头文件event.h,封装细节的内部头文件,以及框架文件如event.c,处理不同多路复用器的封装。定时事件由min-heap.h管理,信号相关的代码在signal.c,辅助函数在evutil.h和log.h。日志、缓冲区、基本数据结构和实用网络库也各司其职。 4. 事件类型与管理 Libevent支持三种基本事件类型:I/O(EV_READ/EV_WRITE)、定时(EV_TIMEOUT)和信号(EV_SIGNAL)。事件结构包含回调函数、描述符和事件类型。定时事件通过小根堆实现高效管理,而I/O和信号事件则分别在链表中组织。 5. 事件管理的底层机制 事件管理通过链表节点和堆索引实现,当事件就绪,它们会被放置到对应优先级链表并执行回调。这包括设置事件的描述符、类型、回调函数和参数,以及事件基础的事件处理核心操作。 通过这些关键环节,Libevent确保了异步编程的高效性和灵活性,是构建高性能网络应用的理想选择。深入理解这些原理,将有助于你在实际项目中更好地利用Libevent的潜力。 相关资源 对于更深入的学习,可以参考相关视频教程和文档:[视频链接]C++学到什么程度可以面试工作
要掌握C++达到面试工作水平,首先需要对C++有全面理解,包括基础语法、数据结构、算法、面向对象编程、异常处理、模板、库使用以及性能优化。这里列出一些书籍推荐以帮助你系统学习:
《C++ Primer中文版》为初学者提供友好的学习路径,作者清晰地讲解了C语言基础与编程细节,包含丰富的例程和习题。
《高质量程序设计指南》强调编程规范,帮助培养良好的编码习惯,深入巩固知识。
《Essential C++》强调快速上手和理解C++编程原理,通过程序问题和语言特性讲解,让你不仅学会C++函数和结构,还理解其设计目的。
《More effective C++》围绕条准则,详细讲解如何编写更好质量的C++代码。
《C++ Templates中文版》深入了解现代C++模板,不仅权威解释模板,也深入一般C++思想。
《STL源码剖析》详细解析STL底层实现,深入理解常用数据结构和C++内存管理。
《提高C++性能的编程技术》关注%性能缺陷影响%时间,详细讨论性能提升细节。
《从缺陷中学习C/C++》作为错题集,包含个问题引发的错误,帮助避坑。
视频课程方面,推荐黑马C++课程、侯捷老师的C++视频全集与陈硕大佬的网络编程课程。
对于数据结构与算法,实践至关重要。动手编写代码,并结合绘图,直观理解数据结构。推荐书籍《大话数据结构》、《算法(第4版)》、《数据结构与算法分析》、《算法图解》、《我的第一本算法书》。在leetcode和牛客网上多刷题。
数据库学习推荐《LeetCode题解》。计算机网络基础课程可以参考郝斌数据结构或浙江大学的数据结构课程。计算机组成原理课程推荐清华大学刘卫东或哈尔滨工业大学刘宏伟的课程。操作系统课程则有南京大学“操作系统:设计与实现”。
网络编程方面,可以参考陈硕大佬的《Linux CC++网络编程实践》和开源库muduo,以及libevent和Asio等。
关于C++编码规范,建议阅读相关书籍并熟悉Git的基本使用。Git使用可关注@程序员编程指南,了解更多学习资源。
2024-11-13 10:38
2024-11-13 10:36
2024-11-13 10:14
2024-11-13 10:12
2024-11-13 09:44