CO C++ 基础库开源项目

我要开发同款
匿名用户2020年07月12日
45阅读
所属分类C/C++、程序开发、常用工具包
授权协议MIT

作品详情

BasicCO 是一个优雅、高效的C++基础库,支持Linux,Windows与Mac平台。CO 追求极简、高效,不依赖于 boost 等三方库。

CO 包含协程库(golang-style)、网络库(tcp/http/rpc)、日志库、命令行与配置文件解析库、单元测试框架、json库等基本组件。

参考文档中文English亮点功能

co

co 是一个 golang 风格的C++协程库,有如下特性:

支持多线程调度,默认线程数为系统CPU核数.

协程共享线程栈(默认大小为1MB),内存占用极低,单机可轻松创建数百万协程.

支持系统apihook(Linux&Mac).

支持协程锁 co::Mutex.

支持协程同步事件 co::Event.

支持协程池 co::Pool.

用 go() 创建协程:

voidfun(){std::cout<<"helloworld"<<std::endl;}go(fun);

so

so 是基于协程的C++网络库,可轻松实现同时支持 ipv4 与 ipv6 的网络程序,包含如下几个模块:

tcp模块,支持一般的tcp编程.

http模块,支持基本的http编程.

rpc模块,基于json的rpc框架,单线程qps可达到12w+.

实现静态 webserver:

#include"co/flag.h"#include"co/log.h"#include"co/so.h"DEF_string(d,".","rootdir");//指定webserver根目录intmain(intargc,char**argv){flag::init(argc,argv);log::init();so::easy(FLG_d.c_str());//mumneverhavetoworryagainreturn0;}实现一般的httpserver:http::Serverserv("0.0.0.0",80);serv.on_req([](consthttp::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 是一个超级快的本地日志系统,打印日志比 printf 更安全:

LOG<<"hello"<<23;//infoELOG<<"helloagain";//error

下面直观感受一下 log 的性能:

logvsgloggoogleglogco/logwin2012HHD1.6MB/s180MB/swin10SSD3.7MB/s560MB/smacSSD17MB/s450MB/slinuxSSD54MB/s1023MB/s

上表是单线程连续打印100万条info日志(每条50字节左右)的测试结果,co/log 几乎快了 glog 两个数量级。

为何如此快?一是log库内部基于比 sprintf 快8-25倍的 fastream 实现,二是log库几乎没有什么内存分配操作。

flag

flag 是一个方便、易用的命令行及配置文件解析库,支持自动生成配置文件。

#include"co/flag.h"DEF_int32(i,32,"comments");DEF_string(s,"xxx","stringtype");intmain(intargc,char**argv){flag::init(argc,argv);std::cout<<"i:"<<FLG_i<<std::endl;std::cout<<"s:"<<FLG_s<<std::endl;return0;}

编译后运行:

./xx#以默认参数启动./xx-i=4k-s="helloworld"#整数类型可以带单位k,m,g,t,p,不分大小写./xx-i4k-s"helloworld"#与上等价./xx--mkconf#自动生成配置文件xx.conf./xx-config=xx.conf#从配置文件启动

json

json 是一个速度堪比 rapidjson 的json库,如果使用 jemalloc,parse 与 stringify 的性能会进一步提升。此库对json标准的支持不如rapidjson全面,但能满足程序员的基本需求,且更容易使用。

代码构成

co/include

libco 的头文件。

co/src

libco 的源代码。

co/test

一些测试代码,每个 .cc 文件都会编译成一个单独的测试程序。

co/unitest

一些单元测试代码,每个 .cc 文件对应不同的测试单元,所有代码都会编译到单个测试程序中。

co/gen

代码生成工具,根据proto文件,自动生成rpc框架代码。

编译执行xmakeCO 推荐使用 xmake 进行编译。

编译器

Linux: gcc4.8+Mac: clang3.3+Windows: vs2015+

安装xmake

windows,mac与debian/ubuntu可以直接去xmake的 release 页面下载安装包,其他系统请参考xmake的 Installation 说明。

xmake在linux上默认禁止root用户编译,ruki 说不安全,可以在 ~/.bashrc 中加上下面的一行,启用root编译:

exportXMAKE_ROOT=y

快速上手

#所有命令都在co根目录执行,后面不再说明xmake#默认编译libco与genxmake-a#编译所有项目(libco,gen,co/test,co/unitest)

编译libco

xmakebuildlibco#编译libcoxmake-blibco#与上同

编译及运行unitest代码

co/unitest 是单元测试代码,用于检验libco库功能的正确性。

xmakebuildunitest#build可以简写为-bxmakerununitest-a#执行所有单元测试xmakerunitest-a#同上xmakerunitest-os#执行单元测试osxmakerunitest-json#执行单元测试json

编译及运行test代码

co/test 包含了一些测试代码。co/test目录下增加 xxx.cc 源文件,然后在co根目录下执行 xmakebuildxxx 即可构建。

xmakebuildflag#编译flag.ccxmakebuildlog#编译log.ccxmakebuildjson#编译json.ccxmakebuildrapidjson#编译rapidjson.ccxmakebuildrpc#编译rpc.ccxmakebuildeasy#编译so/easy.ccxmakebuildpingpong#编译so/pingpong.ccxmakerflag-xz#测试flag库xmakerlog#测试log库xmakerlog-cout#终端也打印日志xmakerlog-perf#log库性能测试xmakerjson#测试jsonxmakerrapidjson#测试rapidjsonxmakerrpc#启动rpcserverxmakerrpc-c#启动rpcclientxmakereasy-dxxx#启动webserverxmakerpingpong#pingpongserver:127.0.0.1:9988xmakerpingpongip=::#pingpongserver::::9988(ipv6)xmakerpingpong-cip=::1#pingpongclient->::1:9988

编译gen

#建议将gen放到系统目录下(如/usr/local/bin/).xmakebuildgengenhello_world.proto

proto 文件格式可以参考 hello_world.proto。

安装

#默认安装头文件、libco、genxmakeinstall-opkg#打包安装到pkg目录xmakei-opkg#同上xmakeinstall-o/usr/local#安装到/usr/local目录cmakeizhengfan 帮忙提供了cmake支持:

默认只编译 libco 与 gen.编译生成的库文件在build/lib目录下,可执行文件在build/bin目录下.可以用 BUILD_ALL 指定编译所有项目.可以用 CMAKE_INSTALL_PREFIX 指定安装目录.mkdirbuild&&cdbuildcmake..cmake..-DBUILD_ALL=ON-DCMAKE_INSTALL_PREFIX=pkgmake-j8makeinstallLicenseCO 以 MIT License发布. CO 包含了一些其他项目的代码,可能使用了与 CO 不同的License,详情见 LICENSE.md。

特别致谢co/context 的相关代码取自 ruki 的 tbox,特别表示感谢!co英文参考文档,由 Leedehai(1-10),daidai21(11-15)与 google 翻译,特别表示感谢!ruki 帮忙改进了xmake编译脚本,特别表示感谢!izhengfan 提供了cmake编译脚本,特别表示感谢!
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论