【开源】低代码 C++程序框架,Linux多线程程序

大家好,欢迎来到停止重构的频道。

本期介绍我们新的C++低代码框架:Bees,用于编写Linux/Unix的多线程程序。

低代码框架一般是不会对C++程序下手的,因为C++程序一般是比较复杂的程序,光是多线程同步就够头疼的了。

但是我们还是完成了这个C++低代码框架。

我们按这样的顺序展开介绍:

1、低代码的偏见

2、Bees的工作原理

3、多线程问题

4、Bees只是一种规则

1 低代码的偏见

低代码只能做一些简单的程序,这是很多人的观点。

是的,我曾经也这么认为,我也曾经认为低代码只能做简单的表单拼接、流程编排。

所以在前端框架Trick和云计算框架Hive的第一个版本中,也没有低代码化

因为当时有几个无法解决的问题,前端框架无法解决UI组件的嵌套表达,无法灵活替换插槽内容。C++框架无法解决多线程、线程同步。

而在使用自研框架做了几个项目,在编写第一本书《大型网站架构实战》的过程中。

越来越觉得低代码是可行的。

因为80%的编程工作都是在既定规则下的重复代码,如果不能低代码化,也就是不能将这些重复枯燥的代码转化为更为简单的表达。

那么,一定是规整的程度还不够,或者缺少了某个关键的转换设计。​

而且,低代码并不是某种具体的工具或者技术,它仅仅是希望将部分代码转化为更加简单的表达,从而节省学习、调试的时间。

这些时间正是提升软件工程开发效率的关键

我相信任何一个程序员,在写完一段二三百行代码,并一次正常运行时,都反而会产生一种不安,都会怀疑哪里隐藏了问题。​​

2 Bees的工作原理

Bees和停止重构的其他框架一样,都是只做了一件事情业务代码和模块代码分离

​模块代码是需要写C++代码以实现具体功能的,只需要关心通用功能的实现。

例如:文件读写、线程操作、数据队列操作等。

虽然这部分代码是需要手写的,但是只要复制粘贴文件夹就可以无条件复用在多个项目。

而Bees也提供了官方模块库,可以通过命令一键下载/更新模块。

​业务代码是多个业务逻辑片段的代码。

一个业务逻辑片段是一个流程,比如:第一步读取数据,第二步筛选数据,第三步放入数据队列。

对于这样的业务逻辑片段,则不需要写代码,而是通过Json配置编排模块的使用顺序

这也是低代码的部分,也是软件开发中占比较大且枯燥重复的部分。

为了实现这样的业务、模块代码分离

Bees加入了数据池,数据池可以看作是一个业务逻辑片段的全局变量。

在调用模块时,设置模块参数的同时,也会传递这个数据池。

模块处理完毕后,会判断是否发生错误

不发生错误继续将数据池传递到下一个模块,若发生错误则中断逻辑提前结束。

当然,发生错误中断逻辑只是默认行为

可以添加逻辑选择器,以实现更加复杂的逻辑,如发生错误重试、发生错误启动异常逻辑等。

3 多线程问题

以上的模块、业务分离,仅仅解决了单个业务逻辑片段的问题,也就是解决了一个函数的表达。

但是,C++程序一般都是从main函数开始,然后各种调用函数,可能会启动线程,多个线程还会有同步问题

以一个简单的数据挖掘引擎为例,从main函数出发,启动了数据筛选线程、数据处理线程,每个线程都有独自的流程步骤,线程间通过数据池交流。

Bees框架的处理是

程序启动时,从main函数开始,固定调用名为Start的业务逻辑片段,这个业务逻辑片段返回则程序退出

每个业务逻辑片段,都可以通过官方线程操作模块,以实现创建线程并调用某个业务逻辑片段。

至于线程同步,也是通过使用模块完成的。

所有线程同步问题,都可以归结为生产者消费者模型。所以我们也提供了“数据队列”模块,作为线程同步的通用解决方案。

也就是说多,线程问题,都可以通过使用官方模块,或者编写自定义模块解决的。而不是像传统开发一样到处都有锁和条件变量。

4 Bees只是一种规则

Bees实际上是一个C++17的工程

在传统的GCC,或者C-Lang编译基础上,加上了CMake、Conan这两个自动构建工具。

让C++工程也可以像maven、npm一样,通过简单配置就可以自动下载编译第三方库。

Bees和停止重构其他框架的设计理念是一样的,都是希望软件工程更合理分工开发维护成本更低、项目质量更高。

模块代码是需要写实际代码的,是需要有一定开发经验的程序员才能胜任的。

我们希望这些工作能独立开来,一方面,模块可以单独调试开发且无条件复用在别的项目

另一方面,由于项目进度等原因,某些模块可能是临时开发,或者存在缺陷的,以后可以单独替换这些模块

业务代码由于使用Json配置替代了编码,且无需了解实际模块的运行原理,所以业务代码可以交由经验尚浅的程序员完成

业务代码以JSON配置替代,除了能加快开发效率

更重要的是,可以约束业务代码编写,让业务逻辑更加清晰明了,避免每次排查BUG时,都需要先花很长时间理解逻辑,然后再逐一排查。

一个人接手另一个人的业务时,也不需要太长的时间学习理解。

总结

​最后Bees已经放在了Github、Gitee。

我们也提供了完整的使用文档,感兴趣的小伙伴可以尝试一下,点个Star就更好了。

另外,由于C++编译环境配置起来是比较麻烦的,我们也将用于Linux编译的镜像上传到了dockerhub。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25527.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库的sql语句

本篇文章主要用来收集项目开发中,遇到的各种sql语句的编写。 1、根据user表的role_id字段,查询role表。 sql语句:使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(二)

1.安装mogondb数据库 参考MongoDB安装配置教程(详细版)_mongodb安装详细步骤-CSDN博客 安装mondbcompass数据库连接工具 参考https://www.mongodb.com/zh-cn/docs/compass/current/connect/ 2.后端服务 1.创建src文件夹 并在src文件夹下创建 index…

opencv:距离变换 cv2.distanceTransform

函数 cv2.distanceTransform() 用于计算图像中每一个非零点像素与其最近的零点像素之间的距离(Distance Transform, DT算法),输出的是保存每一个非零点与最近零点的距离信息;图像上越亮的点,代表了离零点的距离越远。 …

单目摄像头物体深度计算基础原理

三维空间物体表面点位与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数,而相机参数的求解就是相机标定。 相机的参数矩阵包括内参和外参: 外参:决定现实坐标到摄像机坐标。…

RabbitMQ系列(一)架构解析

RabbitMQ 架构解析 RabbitMQ 是一个基于 AMQP 协议的开源消息中间件,其核心架构通过多组件协作实现高效、可靠的消息传递。以下是其核心组件与协作流程的详细说明: 一、核心组件与功能 Broker(消息代理服务器) RabbitMQ 服务端核…

Spring Cloud Alibaba与Spring Boot、Spring Cloud版本对应关系

一、前言 在搭建SpringCloud项目环境架构的时候,需要选择SpringBoot和SpringCloud进行兼容的版本号,因此对于选择SpringBoot版本与SpringCloud版本的对应关系很重要,如果版本关系不对应,常见的会遇见项目启动不起来,怪…

[Web 信息收集] Web 信息收集 — 手动收集域名信息

关注这个专栏的其他相关笔记:[Web 安全] Web 安全攻防 - 学习手册-CSDN博客 0x01:信息收集 —— 域名联系人信息 当我们知道目标的域名之后,我们要做的第一件事就是获取域名的注册信息,包括该域名的 DNS 服务器信息和注册人的联系…

基于Rook的Ceph云原生存储部署与实践指南(上)

#作者:任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…

使用Crawlee可破题js渲染采集数据

使用 Crawlee 实现自动化爬虫流程 1. Crawlee 简介 Crawlee 是一个强大的爬虫框架,用于快速构建和维护可靠的爬虫。它支持多种爬虫类型,包括基于 Cheerio 和 Playwright 的爬虫,能够高效处理静态和动态网页。 2. 项目目标 通过自动化脚本实…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…

threejs 安装教程

嗨,我是小路。今天主要和大家分享的主题是“threejs 安装教程”。 在当今的数字化时代,用户对视觉体验的要求越来越高。传统的2D网页已经无法满足所有需求,而三维(3D)图形技术则为前端开发者提供了新的方向。…

2025 软件供应链安全情报预警平台建设与实践

何为数字安全供应链情报? 所谓的数字供应链开源安全情报主要针对目标是开源数字应用资产。包括开源组件,中间件和操作系统。开源安全情报类型可以分为三大类: 1 第一类是传统的安全漏洞风险情报,开源漏洞情报数据获取主要有2种渠…

Linux:ELF文件-静动态库原理

✨✨所属专栏:Linux✨✨ ✨✨作者主页:嶔某✨✨ ELF文件 什么是编译?编译就是将程序源代码编译成能让CPU直接执行的机器代码 如果我们要编译一个 .c文件,使用gcc -c将.c文件编译为二进制文件.o ,如果一个项目有多个.…

批量给 Word 添加或设置页眉页脚/页码

在 Word 文档中我们可以设置各种各样的页眉页脚信息,比如设置页码信息、在页眉页脚中插入公司的 logo 信息、联系方式信息等等。当我们有大量的文档需要设置或者修改页眉页脚的时候,今天介绍的方法就可以帮我们快速的完成。 使用场景 批量给 Word 文档设…

GIST框架:深度学习助力组织病理学与转录组学的空间整合分析|顶刊精析·25-02-24

小罗碎碎念 随着空间分子成像技术发展,单细胞空间转录组(SCST)数据为研究组织微环境提供了丰富信息,但数据质量问题和现有分析方法的局限性阻碍了深入研究。GIST框架借助预训练的组织学图像基础模型提取详细形态特征,…

DeepSeek入门学习

参考文档:DeepSeek(人工智能企业)_百度百科 DeepSeek-R1 凭借创新的强化学习技术实现重大突破。在极少量标注数据的基础上,通过深度优化的后训练阶段,显著提升了模型的推理能力。在数学运算、代码生成、自然语言推理等…

RTSP/Onvif安防平台EasyNVR接入EasyNVS显示服务缺失的原因与解决方案

EasyNVS云管理平台具备强大的汇聚与管理功能,支持EasyGBS、EasyNVR等平台的接入,能够将接入的视频资源进行统一输出,提供远程可视化运维等管理功能,特别适合解决设备现场没有固定公网IP但仍需在公网直播的需求。 在某次用户现场部…

【计算机网络协议02】详解传输层协议TCP/UDP

传输层 传输层是OSI模型的第四层,主要负责端到端的数据传输,确保数据可靠、有> 序地从源设备传送到目标设备。其主要功能包括: 端到端通信:在源和目标设备之间建立连接,确保数据准确传输。数据分段与重组&#xff1…

图片爬取案例

修改前的代码 但是总显示“失败” 原因是 修改之后的代码 import requests import os from urllib.parse import unquote# 原始URL url https://cn.bing.com/images/search?viewdetailV2&ccidTnImuvQ0&id5AE65CE4BE05EE7A79A73EEFA37578E87AE19421&thidOIP.TnI…

【HarmonyOS Next】地图使用详解(一)

背景 这系列文章主要讲解鸿蒙地图的使用,当前可以免费使用,并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。需要注意的是,现在测试只能使用实体手机去…