微信后台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库学习协程


相关文章
|
9月前
|
XML Java Android开发
微信虚拟视频插件安卓,微信虚拟相机替换拍照,java源码分享
完整的相机应用项目包含三个主要文件:主活动实现、布局文件和清单文件。代码实现了相机预览、
|
7月前
|
缓存 小程序 前端开发
商城/点餐/家政类小程序源码合集_微信抖音小程序源码开发从入门到精通实战
本文系统讲解如何利用现有源码快速开发商城、点餐、家政类微信/抖音小程序,涵盖环境搭建、核心功能实现、多平台部署与优化,提供完整技术方案。实战导向,助力开发者高效入门与落地。
|
7月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
7月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
9月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
10月前
|
存储 缓存 运维
微信读书十周年,后台架构的技术演进和实践总结
微信读书经过了多年的发展,赢得了良好的用户口碑,后台系统的服务质量直接影响着用户的体验。团队多年来始终保持着“小而美”的基因,快速试错与迭代成为常态。后台团队在日常业务开发的同时,需要主动寻求更多架构上的突破,提升后台服务的可用性、扩展性,以不断适应业务与团队的变化。
402 0
|
小程序 Java 关系型数据库
weixin116大学生就业平台微信小程序+ssm(文档+源码)_kaic
本文介绍了一款大学生就业平台微信小程序的开发过程,涵盖开发环境、系统设计、实现与测试等方面。该小程序基于微信平台特性,采用MYSQL数据库存储数据,确保系统稳定与安全,同时满足学生、企业和管理员不同权限用户的功能需求。通过简化操作流程,实现了招聘信息查看、简历投递等实用功能,旨在为用户提供便捷高效的求职体验,符合“操作简单,功能实用”的设计理念。
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
小程序 JavaScript Java
基于SpringBoot的智慧停车场微信小程序源码分享
智慧停车场微信小程序主要包含管理端和小程序端。管理端包括停车场管理,公告信息管理,用户信息管理,预定信息管理,用户反馈管理等功能。小程序端包括登录注册,预约停车位,停车导航,停车缴费,用户信息,车辆信息,钱包充值,意见反馈等功能。
775 5
基于SpringBoot的智慧停车场微信小程序源码分享
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。