[libco] 协程库学习,测试连接 mysql

历史原因,一直使用 libev 作为服务底层;异步框架虽然性能比较高,但新人使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率。

用同步方式实现异步功能,既保证了异步性能优势,又使得同步方式实现源码思路清晰,容易维护,这是协程的优势。带着这样的目的学习微信开源的一个轻量级网络协程库:libco

文章来源: [libco] 协程库学习,测试连接 mysql


1. 概述

libco 是轻量级的协程库,看完下面几个帖子,应该能大致搞懂它的工作原理。

  1. 微信开源C++协程库Libco—原理与应用
  2. 漫谈微信libco协程设计及实现(万字长文)
  3. 动态链接黑魔法: Hook 系统函数
  4. libco 分析(上):协程的实现
  5. 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值