CO
是一个优雅、高效的 C++ 基础库,支持 Linux, Windows 与 Mac 平台。CO
追求极简、高效,不依赖于 boost 等三方库。
CO
包含协程库(golang-style)、网络库(tcp/http/rpc)、日志库、命令行与配置文件解析库、单元测试框架、json 库等基本组件。
co
是一个 golang 风格的 C++ 协程库,有如下特性:
支持多线程调度,默认线程数为系统 CPU 核数.
协程共享线程栈(默认大小为 1MB),内存占用极低,单机可轻松创建数百万协程.
支持系统 api hook (Linux & Mac).
支持协程锁 co::Mutex.
支持协程同步事件 co::Event.
支持协程池 co::Pool.
用 go()
创建协程:
void fun() { std::cout << "hello world" << std::endl; } go(fun);
so
是基于协程的 C++ 网络库,可轻松实现同时支持 ipv4
与 ipv6
的网络程序,包含如下几个模块:
tcp 模块, 支持一般的 tcp 编程.
http 模块, 支持基本的 http 编程.
rpc 模块,基于 json 的 rpc 框架,单线程 qps 可达到 12w+.
实现静态 web server:
#include "co/flag.h" #include "co/log.h" #include "co/so.h" DEF_string(d, ".", "root dir"); // 指定 web server 根目录 int main(int argc, char** argv) { flag::init(argc, argv); log::init(); so::easy(FLG_d.c_str()); // mum never have to worry again return 0; }
http::Server serv("0.0.0.0", 80); serv.on_req( [](const http::Req& req, http::Res& res) { if (req.is_method_get()) { if (req.url() == "/hello") { res.set_status(200); res.set_body("hello world"); } else { res.set_status(404); } } else { res.set_status(501); } } ); serv.start();
log
是一个超级快的本地日志系统,打印日志比 printf
更安全:
LOG << "hello " << 23; // info ELOG << "hello again"; // error
下面直观感受一下 log
的性能:
log vs glog | google glog | co/log |
---|---|---|
win2012 HHD | 1.6MB/s | 180MB/s |
win10 SSD | 3.7MB/s | 560MB/s |
mac SSD | 17MB/s | 450MB/s |
linux SSD | 54MB/s | 1023MB/s |
上表是单线程连续打印 100 万条 info 日志(每条 50 字节左右)的测试结果,co/log 几乎快了 glog 两个数量级。
为何如此快?一是 log 库内部基于比 sprintf
快 8-25 倍的 fastream 实现,二是 log 库几乎没有什么内存分配操作。
flag
是一个方便、易用的命令行及配置文件解析库,支持自动生成配置文件。
#include "co/flag.h" DEF_int32(i, 32, "comments"); DEF_string(s, "xxx", "string type"); int main(int argc, char** argv) { flag::init(argc, argv); std::cout << "i: " << FLG_i << std::endl; std::cout << "s: " << FLG_s << std::endl; return 0; }
编译后运行:
./xx # 以默认参数启动 ./xx -i=4k -s="hello world" # 整数类型可以带单位 k,m,g,t,p, 不分大小写 ./xx -i 4k -s "hello world" # 与上等价 ./xx --mkconf # 自动生成配置文件 xx.conf ./xx -config=xx.conf # 从配置文件启动
json
是一个速度堪比 rapidjson 的 json 库,如果使用 jemalloc,parse
与 stringify
的性能会进一步提升。此库对 json 标准的支持不如 rapidjson 全面,但能满足程序员的基本需求,且更容易使用。
libco
的头文件。
libco
的源代码。
一些测试代码,每个 .cc
文件都会编译成一个单独的测试程序。
一些单元测试代码,每个 .cc
文件对应不同的测试单元,所有代码都会编译到单个测试程序中。
代码生成工具,根据 proto 文件,自动生成 rpc 框架代码。
CO
推荐使用 xmake 进行编译。
编译器
安装 xmake
windows, mac 与 debian/ubuntu 可以直接去 xmake 的 release 页面下载安装包,其他系统请参考 xmake 的 Installation 说明。
xmake 在 linux 上默认禁止 root 用户编译,ruki 说不安全,可以在 ~/.bashrc
中加上下面的一行,启用 root 编译:
export XMAKE_ROOT=y
快速上手
# 所有命令都在 co 根目录执行,后面不再说明 xmake # 默认编译 libco 与 gen xmake -a # 编译所有项目 (libco, gen, co/test, co/unitest)
编译 libco
xmake build libco # 编译 libco xmake -b libco # 与上同
编译及运行 unitest 代码
co/unitest 是单元测试代码,用于检验 libco 库功能的正确性。
xmake build unitest # build 可以简写为 -b xmake run unitest -a # 执行所有单元测试 xmake r unitest -a # 同上 xmake r unitest -os # 执行单元测试 os xmake r unitest -json # 执行单元测试 json
编译及运行 test 代码
co/test 包含了一些测试代码。co/test 目录下增加 xxx.cc
源文件,然后在 co 根目录下执行 xmake build xxx
即可构建。
xmake build flag # 编译 flag.cc xmake build log # 编译 log.cc xmake build json # 编译 json.cc xmake build rapidjson # 编译 rapidjson.cc xmake build rpc # 编译 rpc.cc xmake build easy # 编译 so/easy.cc xmake build pingpong # 编译 so/pingpong.cc xmake r flag -xz # 测试 flag 库 xmake r log # 测试 log 库 xmake r log -cout # 终端也打印日志 xmake r log -perf # log 库性能测试 xmake r json # 测试 json xmake r rapidjson # 测试 rapidjson xmake r rpc # 启动 rpc server xmake r rpc -c # 启动 rpc client xmake r easy -d xxx # 启动 web server xmake r pingpong # pingpong server: 127.0.0.1:9988 xmake r pingpong ip=:: # pingpong server: :::9988 (ipv6) xmake r pingpong -c ip=::1 # pingpong client -> ::1:9988
编译 gen
# 建议将 gen 放到系统目录下(如 /usr/local/bin/).
xmake build gen
gen hello_world.proto
proto
文件格式可以参考 hello_world.proto。
安装
# 默认安装头文件、libco、gen xmake install -o pkg # 打包安装到 pkg 目录 xmake i -o pkg # 同上 xmake install -o /usr/local # 安装到 /usr/local 目录
izhengfan 帮忙提供了 cmake 支持:
libco
与 gen
.BUILD_ALL
指定编译所有项目.CMAKE_INSTALL_PREFIX
指定安装目录.mkdir build && cd build cmake .. cmake .. -DBUILD_ALL=ON -DCMAKE_INSTALL_PREFIX=pkg make -j8 make install
CO
以 MIT
License 发布. CO
包含了一些其他项目的代码,可能使用了与 CO
不同的 License,详情见 LICENSE.md。
“Co.,"为Company的缩写;"Ltd."为Limited的缩写;"Co.,Ltd."连在一起为Company Limited,就是有限公司的意思。“Co”后面的“.”是英文中表示词语短缩省略的符号,所以“Ltd”的后面也应该有一个“.”(一些公司的英文名称,“Ltd”后面也是有一个“.”的)。而“Co.” 后面的“,”则是用来区分前后两个词的分离号。
添加一个资源域 什么是资源域? 资源域是 CloudStack™ 部署中最大的组织单位。虽然允许一个数据中心中存在多个资源域,但是一个资源域通常与一个数据中心相对应。将基础架构编组到资源域中的好处是可以提供物理隔离和冗余。例如,每个资源域都可以拥有各自的电源供应和网络上行方案,并且各资源域可以在地理位置上相隔很远(虽然并非必须相隔很远)。 什么是群集? 群集提供了一种编组主机的方法。群集中的所有主
以Co开头的单词发音把我搞晕了。 GG和我说co发[ké]是非重读,发[kó]是重读。 单词结尾是发[FEn],如tion,sion的重音是在倒数第二个音节上。 醍醐灌顶啊,山东的教育就是牛 我再来终结一个规律 Co开头的动词一般发[ké],如condense,conform,compress,comprise
Co v4 co@4.0.0 has been released, which now relies on promises. It is a stepping stone towards the async/await proposal. The primary API change is how co() is invoked. Before, co returned a “thunk”, w
什么是co-saliency? 2010年,Jacobs等人首次给出co-saliency的定义【cosaliency: where people look when comparing images】,指的是从一堆图像中找到特定的对象。 这种定义存在局限性,即必须采用同一镜头获取的相似图像来进行检测。这种局限限制了co-saliency的应用,即不具有通用性。 更受
SAP CO Report 1、成本与收入会计报表 S_ALR_87013598 成本要素: 按业务部门细分 S_ALR_87013599 成本要素: 按功能范围细分 S_ALR_87013600 成本要素: 列中的对象类 2、凭证显示 KSB5 管理会计凭证: 实际成本 KALR 统驭分类帐: CO 行项目 3、成本中心计划与实际成本比较 S_ALR_87013611 成本中心: 实际/计划
* Note: 25559 Allocation: Frequent Customizing errors * Note: 584945 Allocation: Debit/credit indicator as receiver tracing * Note: 64805 ALLOCATION: Find error in cycles * Note: 416507 ALLO
物料成本构成 TCK07 成本构成结构 (用公司代码取elehk) TCKH3 成本构成结构和对应的列 ckmlhd 成本估算号(物料+工厂得到一个成本估算号) marc 取成本核算批量 ckmlprkeph 标准成本 (成本估算号+年度+期间 得到一条数据) mlcd 产量 (成本估算号+年度+期间得到多条数据) ckmlkeph 差异(成本估算号+年度+期间得到多条数据) CKMLCR 分类账
Mohammed A. El-Meligy Advanced Manufacturing Institute, King Saud University, Riyadh-11421, Saudi Arabia. e-mail: melmeligy@ksu.edu.sa Mohamed Sharaf Industrial Engineering Department, College of E
首先先认识下什么是co-training: 在计算机视觉中,我们都知道训练一个分类器的时候,我们需要两类样本,分别是正样本和负样本。监督训练又可以成为off-line training,就是提前准备好已经标注过样本,然后对分类器进行训练,最后将训练好的分类器对需要进行分类的东西进行分类。而另一个是online training. 刚开始的时候我们用一些标注过的样本对分类器进行初始化训练。这
1.函数作为返回值。 使用场合 Definition constfun {X: Type} (x: X) : nat->X := fun (k:nat) => x. 因为constfun的返回值是nat->X.所以需要一个函数作为其返回值。 例子: Definition override {X: Type} (f: nat->X) (k:nat) (x:X) : nat->X:= fun
Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 121 Accepted Submission(s): 56 Problem Description Given a number N, you are asked
co模块是一个小工具,用于 Generator函数的自动执行,它的源码只有几十行。 github.com/tj/co 转载于:https://juejin.im/post/5bc4ae9fe51d450e6548c73c
co 函数库是著名程序员 TJ Holowaychuk 于2013年6月发布的一个小工具,用于 Generator 函数的自动执行。 一、Co库的原理: 前面文章说过,Generator 函数就是一个异步操作的容器。它的自动执行需要一种机制,当异步操作有了结果,能够自动交回执行权。 两种方法可以做到这一点。 (1)回调函数。将异步操作包装成 Thunk 函数,在回调函数里面交回执行权。 (2)Pr
Co-simulation is a technique used in engineering and computer science to simulate the interaction between multiple systems. It involves running separate simulations of different components of a larger
ember language server extension ember-language-server extension for coc.nvim Install Via Plug Plug 'nullvoxpopuli/coc-ember', {'do': 'yarn install --frozen-lockfile'} Or via the automatically kept up-
不要被各种关于 reducers, middleware, store 的演讲所蒙蔽 —— Redux 实际是非常简单的。如果你有 Flux 开发经验,用起来会非常习惯。没用过 Flux 也不怕,很容易! 下面的教程将会一步步教你开发简单的 Todo 应用。 Action Reducer Store 数据流 搭配 React 示例:Todo 列表
StackExchange.Redis 中核心对象是在 StackExchange.Redis 命名空间中的 ConnectionMultiplexer 类,这个对象隐藏了多个服务器的详细信息。 因为ConnectionMultiplexer要做很多事,它被设计为在调用者之间可以共享和重用。 你不应该在执行每一个操作的时候就创建一个 ConnectionMultiplexer. 它完全是线程安全的
本部分介绍了 ES6 中的常用基本概念,旨在让大家对 ES6 有个初步的理解。具体内容包括: 变量 字符串 数值 数组 函数 对象 正则 集合 Symbol
路由配置 路由匹配原理 History 默认路由(IndexRoute)与 IndexLink
只是打印出 hello world 肯定是不够的,是吗?你会希望做得比这还要多——你想要输入一些内容,操纵它,然后从中得到一些输出出来的内容。我们可以在 Python 中通过使用变量与常量来实现这一目标,在本章中我们还会学习其它的一些概念。自本章起,书中将出现大量程序源代码内容,在源代码中会包含一些英文语句或者英文注释。为保持源代码整体美观以及避免其它不必要的改动,在代码内容中出现的英文语句将会保
本章主要介绍两个方面的内容: 字符编码 输入和输出 其中,字符编码的概念很重要,不管你用的是 Python2 还是 Python3,亦或是 C++ 等其他编程语言,希望读者厘清这个概念,当遇到 UnicodeEncodeError 和 UnicodeDecodeError 时才能从容应对,而不是到处查找资料。
我们用一个最简单的程序来开始对GTK的介绍,下面的程序将创造一个200×200像素的窗体。 新建一个名为 example-0.c 的文件,写入如下内容: #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_init (&argc, &argv); window