BasicCO 是一个优雅、高效的C++基础库,支持Liux,Widows与Mac平台。CO 追求极简、高效,不依赖于 boost 等三方库。
CO 包含协程库(golag-style)、网络库(tcp/http/rpc)、日志库、命令行与配置文件解析库、单元测试框架、jso库等基本组件。参考文档中文Eglish亮点功能co
co 是一个 golag 风格的C++协程库,有如下特性:
支持多线程调度,默认线程数为系统CPU核数.
协程共享线程栈(默认大小为1MB),内存占用极低,单机可轻松创建数百万协程.
支持系统apihook(Liux&Mac).
支持协程锁 co::Mutex.
支持协程同步事件 co::Evet.
支持协程池 co::Pool.
用 go() 创建协程:
voidfu(){std::cout<<"helloworld"<<std::edl;}go(fu);so
so 是基于协程的C++网络库,可轻松实现同时支持 ipv4 与 ipv6 的网络程序,包含如下几个模块:
tcp模块,支持一般的tcp编程.
http模块,支持基本的http编程.
rpc模块,基于jso的rpc框架,单线程qps可达到12w+.
实现静态 webserver:
#iclude"co/flag.h"#iclude"co/log.h"#iclude"co/so.h"DEF_strig(d,".","rootdir");//指定webserver根目录itmai(itargc,char**argv){flag::iit(argc,argv);log::iit();so::easy(FLG_d.c_str());//mumeverhavetoworryagairetur0;}实现一般的httpserver:http::Serverserv("0.0.0.0",80);serv.o_req([](costhttp::Req&req,http::Res&res){if(req.is_method_get()){if(req.url()=="/hello"){res.set_status(200);res.set_body("helloworld");}else{res.set_status(404);}}else{res.set_status(501);}});serv.start();log
log 是一个超级快的本地日志系统,打印日志比 pritf 更安全:
LOG<<"hello"<<23;//ifoELOG<<"helloagai";//error下面直观感受一下 log 的性能:
logvsgloggoogleglogco/logwi2012HHD1.6MB/s180MB/swi10SSD3.7MB/s560MB/smacSSD17MB/s450MB/sliuxSSD54MB/s1023MB/s上表是单线程连续打印100万条ifo日志(每条50字节左右)的测试结果,co/log 几乎快了 glog 两个数量级。
为何如此快?一是log库内部基于比 spritf 快8-25倍的 fastream 实现,二是log库几乎没有什么内存分配操作。
flag
flag 是一个方便、易用的命令行及配置文件解析库,支持自动生成配置文件。
#iclude"co/flag.h"DEF_it32(i,32,"commets");DEF_strig(s,"xxx","strigtype");itmai(itargc,char**argv){flag::iit(argc,argv);std::cout<<"i:"<<FLG_i<<std::edl;std::cout<<"s:"<<FLG_s<<std::edl;retur0;}编译后运行:
./xx#以默认参数启动./xx-i=4k-s="helloworld"#整数类型可以带单位k,m,g,t,p,不分大小写./xx-i4k-s"helloworld"#与上等价./xx--mkcof#自动生成配置文件xx.cof./xx-cofig=xx.cof#从配置文件启动jso
jso 是一个速度堪比 rapidjso 的jso库,如果使用 jemalloc,parse 与 strigify 的性能会进一步提升。此库对jso标准的支持不如rapidjso全面,但能满足程序员的基本需求,且更容易使用。
代码构成co/iclude
libco 的头文件。
co/src
libco 的源代码。
co/test
一些测试代码,每个 .cc 文件都会编译成一个单独的测试程序。
co/uitest
一些单元测试代码,每个 .cc 文件对应不同的测试单元,所有代码都会编译到单个测试程序中。
co/ge
代码生成工具,根据proto文件,自动生成rpc框架代码。
编译执行xmakeCO 推荐使用 xmake 进行编译。编译器
Liux: gcc4.8+Mac: clag3.3+Widows: vs2015+安装xmake
widows,mac与debia/ubutu可以直接去xmake的 release 页面下载安装包,其他系统请参考xmake的 Istallatio 说明。
xmake在liux上默认禁止root用户编译,ruki 说不安全,可以在 ~/.bashrc 中加上下面的一行,启用root编译:
exportXMAKE_ROOT=y快速上手
#所有命令都在co根目录执行,后面不再说明xmake#默认编译libco与gexmake-a#编译所有项目(libco,ge,co/test,co/uitest)编译libco
xmakebuildlibco#编译libcoxmake-blibco#与上同编译及运行uitest代码
co/uitest 是单元测试代码,用于检验libco库功能的正确性。
xmakebuilduitest#build可以简写为-bxmakeruuitest-a#执行所有单元测试xmakeruitest-a#同上xmakeruitest-os#执行单元测试osxmakeruitest-jso#执行单元测试jso编译及运行test代码
co/test 包含了一些测试代码。co/test目录下增加 xxx.cc 源文件,然后在co根目录下执行 xmakebuildxxx 即可构建。
xmakebuildflag#编译flag.ccxmakebuildlog#编译log.ccxmakebuildjso#编译jso.ccxmakebuildrapidjso#编译rapidjso.ccxmakebuildrpc#编译rpc.ccxmakebuildeasy#编译so/easy.ccxmakebuildpigpog#编译so/pigpog.ccxmakerflag-xz#测试flag库xmakerlog#测试log库xmakerlog-cout#终端也打印日志xmakerlog-perf#log库性能测试xmakerjso#测试jsoxmakerrapidjso#测试rapidjsoxmakerrpc#启动rpcserverxmakerrpc-c#启动rpcclietxmakereasy-dxxx#启动webserverxmakerpigpog#pigpogserver:127.0.0.1:9988xmakerpigpogip=::#pigpogserver::::9988(ipv6)xmakerpigpog-cip=::1#pigpogcliet->::1:9988编译ge
#建议将ge放到系统目录下(如/usr/local/bi/).xmakebuildgegehello_world.protoproto 文件格式可以参考 hello_world.proto。
安装
#默认安装头文件、libco、gexmakeistall-opkg#打包安装到pkg目录xmakei-opkg#同上xmakeistall-o/usr/local#安装到/usr/local目录cmakeizhegfa 帮忙提供了cmake支持:默认只编译 libco 与 ge.编译生成的库文件在build/lib目录下,可执行文件在build/bi目录下.可以用 BUILD_ALL 指定编译所有项目.可以用 CMAKE_INSTALL_PREFIX 指定安装目录.mkdirbuild&&cdbuildcmake..cmake..-DBUILD_ALL=ON-DCMAKE_INSTALL_PREFIX=pkgmake-j8makeistallLiceseCO 以 MIT Licese发布. CO 包含了一些其他项目的代码,可能使用了与 CO 不同的Licese,详情见 LICENSE.md。特别致谢co/cotext 的相关代码取自 ruki 的 tbox,特别表示感谢!co英文参考文档,由 Leedehai(1-10),daidai21(11-15)与 google 翻译,特别表示感谢!ruki 帮忙改进了xmake编译脚本,特别表示感谢!izhegfa 提供了cmake编译脚本,特别表示感谢!









评论