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.protoproto 文件格式可以参考 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编译脚本,特别表示感谢!
评论