Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
Warning: WP_Syntax::substituteToken(): Argument #1 ($match) must be passed by reference, value given in /www/wwwroot/fawdlstty.com/wp-content/plugins/wp-syntax/wp-syntax.php on line 383
仓库地址:https://github.com/fawdlstty/libfv
介绍一款船新HTTP库。C++的HTTP库很多,但基于C++20的异步网络HTTP库几乎没有。我没找到好用的,因此写了一个。在讲解这个库之前,我先说说为什么我们需要这样的库。
C++ HTTP库有两种主要的实现方式,第一种是同步HTTP网络访问,比如这样的代码:
1 2 3 | // 伪代码 Response _r = HttpGet ("https://t.cn"); std::cout << _t.text; |
这样的代码写起来很简单,但它存在一个问题:HTTP网络访问比较耗时,可能需要几百毫秒,这么长时间,这个线程将阻塞在这里,比较消耗线程资源。假如遇到需要同时发起几十、几百个请求,将较大消耗系统资源。很显然,它不是一个较好的设计。
第二种是回调通知,比如这样的代码:
1 2 3 4 | // 伪代码 HttpGet ("https://t.cn", [] (Response _r) { std::cout << _t.text; }); |
这种方式解决了线程问题,也就是,几十、几百个请求可以同时发起,只需要极少量或者一个线程就行,HTTP库内部实现了请求的内部管理,在收到请求的回复后,调用回调函数,从而实现请求的高效处理。但这种方式有个问题,假如我们需要根据请求结果内容转给下一个请求,这会带来一个回调地狱问题,比如这样的代码:
1 2 3 4 5 6 7 8 9 10 11 12 | // 伪代码 HttpGet ("https://t.cn", [] (Response _r) { HttpGet (_t.text, [] (Response _r) { HttpGet (_t.text, [] (Response _r) { HttpGet (_t.text, [] (Response _r) { HttpGet (_t.text, [] (Response _r) { std::cout << _t.text; }); }); }); }); }); |
那么,有没更好的处理方式呢?有,通过C++20的co_await实现异步等待。下面给出libfv的发起请求的代码:
1 | fv::Response _r = co_await fv::Get ("https://t.cn"); |
一方面它能获得回调方式的好处,也就是少量线程支撑同时大量的请求任务,同时它不会带来回调地狱问题。上面的代码通过libfv实现,代码可以这样写:
1 2 3 4 5 6 | fv::Response _r = co_await fv::Get ("https://t.cn"); _r = co_await fv::Get (_r.text); _r = co_await fv::Get (_r.text); _r = co_await fv::Get (_r.text); _r = co_await fv::Get (_r.text); std::cout << _t.text; |
这儿特别说明一下。单CPU处理效率来说,C++20的异步性能比回调要低,大概10%左右,也就是假设理论上跑满网络IO带宽情况,回调需要10%的CPU,那么使用C++20的异步需要11%,这是stackless需要付出的代价。当然,在我看来这个特性完全可以忽略,毕竟IO密集型应用首先需要考虑的是跑满网络带宽,一般不太需要关注CPU使用率。
libfv使用方法见仓库:https://github.com/fawdlstty/libfv
好耶,是高性能的吸嘉嘉
假如有C++写网络请求的应用的话会考虑用qwq(不过咱不敢碰c++就是了)
另外这站什么主题 ~~怎么和我一个看h文的站好像~~