微信后台phxrpc协程库理解(提取协程相关源码)

简介: 微信后台phxrpc协程库理解(提取协程相关源码)

源码来自https://github.com/Tencent/phxrpc


我把协程相关的源码提取出来,写了个测试程序(仿造https://github.com/cloudwu/coroutine/blob/master/main.c),便于理解:


看runtime_.Resume(id)这一行,就是执行当前的协程,这个协程在创建的时候被定位到执行关联的函数处,这个具体实现在uthread_context_system.cpp中,所以当runtime_.Resume(id)时候其实就是执行foo函数。

//https://github.com/Tencent/phxrpc
//https://www.jianshu.com/p/4d95eb7af24b
#include "uthread_runtime.h"
#include <functional>
phxrpc::UThreadRuntime *runtime_;
static void foo(int arg) {
    int start = arg;
    for (int i = 0; i < 5; i++)
    {
        printf("coroutine %d : %d\n",  runtime_->GetCurrUThread(), start + i);
        runtime_->Yield();//放弃
    }
}
static void test() {
    int arg1 = { 0 };
    int arg2 = { 100 };
    int co1 = runtime_->Create(std::bind(&foo, arg1), nullptr);
    int co2 = runtime_->Create(std::bind(&foo, arg2), nullptr);
    printf("main start\n");
    while (!runtime_->IsAllDone())
    {
        runtime_->Resume(co1);//执行
        runtime_->Resume(co2);
        printf("GetUnfinishedItemCount:%d\n", runtime_->GetUnfinishedItemCount());
    }
    printf("main end\n");
}
int main(int argc, char *argv[])
{
    runtime_ = new phxrpc::UThreadRuntime(8192, false);
    test();
    delete runtime_;
    return 0;
}


运行结果是:


main start
coroutine 0 : 0
coroutine 1 : 100
GetUnfinishedItemCount:2
coroutine 0 : 1
coroutine 1 : 101
GetUnfinishedItemCount:2
coroutine 0 : 2
coroutine 1 : 102
GetUnfinishedItemCount:2
coroutine 0 : 3
coroutine 1 : 103
GetUnfinishedItemCount:2
coroutine 0 : 4
coroutine 1 : 104
GetUnfinishedItemCount:2
GetUnfinishedItemCount:0
main end

完整的工程下载地址是:https://download.csdn.net/download/libaineu2004/10874580


另外推荐一个案例:


coroutine example, using phxrpc coroutine framework, receive data from upstream and set redis, qps 12w


https://download.csdn.net/download/hintonic/10758106



---


参考文献:


https://www.jianshu.com/p/4d95eb7af24b


https://github.com/Tencent/libco


https://github.com/cloudwu/coroutine/ 云风


https://github.com/Nickqiaoo/coroutine 带注释的版本


https://blog.csdn.net/LMFQYJ/article/details/79211084  云风coroutine源码分析


https://blog.csdn.net/Swartz2015/article/details/76274688  从云风的coroutine库学习协程


相关文章
|
2月前
|
移动开发 小程序 数据可视化
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
43 2
|
4月前
|
JSON 小程序 JavaScript
微信小程序制作 购物商城首页 【内包含源码】
这篇文章提供了一个微信小程序购物商城首页的实现方法和源码,包括页面布局、数据结构、核心代码以及如何配置tabBar和搜索框组件。
微信小程序制作 购物商城首页 【内包含源码】
|
3月前
|
搜索推荐
2024微信个人名片在线生成HTML源码
微信个人名片卡片在线生成,这是一款微信个人名片生成网站源码,无第三方接口,本地直接生成可长期使用。 主要用于生成用户个性化的名片页面,包括头像、姓名、联系方式、个人介绍等信息。 在本地浏览器打开即可,源码是html的,也可上传到服务器上。
50 0
2024微信个人名片在线生成HTML源码
|
4月前
|
小程序 JavaScript Java
微信小程序+SpringBoot接入后台服务,接口数据来自后端
这篇文章介绍了如何将微信小程序与SpringBoot后端服务进行数据交互,包括后端接口的编写、小程序获取接口数据的方法,以及数据在小程序中的展示。同时,还涉及到了使用Vue搭建后台管理系统,方便数据的查看和管理。
微信小程序+SpringBoot接入后台服务,接口数据来自后端
|
5月前
|
小程序 JavaScript Java
基于微信小程序便捷记账系统设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序便捷记账系统设计与实现(源码+lw+部署文档+讲解等)
137 8
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的宠物医院微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的宠物医院微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
84 7
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的宠物医院微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的宠物医院微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
95 7
|
5月前
|
JavaScript 小程序 Java
基于微信小程序餐厅点餐系统设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序餐厅点餐系统设计与实现(源码+lw+部署文档+讲解等)
259 1
|
5月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的“鼻护灵”微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的“鼻护灵”微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
|
5月前
|
存储 调度 Python
异步编程概述在 Python中,`asyncio`库提供了对异步I/O、事件循环、协程(coroutine)和任务的支持。
异步编程概述在 Python中,`asyncio`库提供了对异步I/O、事件循环、协程(coroutine)和任务的支持。

热门文章

最新文章

下一篇
无影云桌面