历史原因,一直使用 libev 作为服务底层;异步框架虽然性能比较高,但新人使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率。
用同步方式实现异步功能,既保证了异步性能优势,又使得同步方式实现源码思路清晰,容易维护,这是协程的优势。带着这样的目的学习微信开源的一个轻量级网络协程库:libco 。
文章来源: [libco] 协程库学习,测试连接 mysql
1. 概述
libco 是轻量级的协程库,看完下面几个帖子,应该能大致搞懂它的工作原理。
2. 问题
带着问题学习 libco:
- 搞清这几个概念:阻塞,非阻塞,同步,异步,锁。
- 协程是什么东西,与进程和线程有啥关系。
- 协程解决了什么问题。
- 协程在什么场景下使用。
- 协程切换原理。
- 协程切换时机。
- 协程需要上锁吗?
- libco 主要有啥功能。(协程管理,epoll/kevent,hook)
3. libco 源码结构布局
将 libco 的源码结构展开,这样方便理清它的内部结构关系。

4. mysql 测试
- 测试目标:测试 libco 协程性能,以及是否能将 mysqlclient 同步接口进行异步改造。
- 测试系统:CentOS Linux release 7.7.1908 (Core)
- 测试源码:github。
- 测试视频:gdb & libco & mysql
4.1. 测试源码
/* 数据库信息。 */
typedef struct db_s {
std::string host;
int port;
std::string user;
std::string psw;
std::string charset;
} db_t;
/* 协程任务。 */
typedef struct task_s {
int id; /* 任务 id。 */
db_t* db; /* 数据库信息。 */
MYSQL* mysql; /* 数据库实例指针。 */
stCoRoutine_t* co; /* 协程指针。 */
} task_t;
/* 协程处理函数。 */
void* co_handler_mysql_query(void* arg) {
co_enable_hook_sys();
...
/* 同步方式写数据库访问代码。 */
for (i = 0; i < g_co_query_cnt; i++) {
g_cur_test_cnt++;
/* 读数据库 select。 */
query = "select * from mytest.test_async_mysql where id = 1;";
if (mysql_real_query(task->mysql, query, strlen(query))) {
show_error(task->mysql);
return nullptr;
}
res = mysql_store_result(task->mysql);
mysql_free_result(res

最低0.47元/天 解锁文章
1091

被折叠的 条评论
为什么被折叠?



