搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(一)

本文介绍了C++ workflow库中的序列化接口,包括需要IDL的序列化过程,如encode和append函数的使用,以及errno的设置。文章详细阐述了对象的序列化与反序列化概念,强调了协议与序列化的关系,并探讨了workflow中序列化接口的具体实现和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021SC@SDUSC

目录

一. 简单介绍序列化与反序列化

二.协议与序列化的关系

三.关于workflow的序列化接口

需要IDL的使用过程:

encode函数:

append函数

errno的设置


一. 简单介绍序列化与反序列化

   

       对象的序列化(Serialization),即把一个对象以流的方式,写入到文件中保存,叫写对象,也叫对象序列化,对象中包含的不仅仅是字符,使用字节流。

       对象的反序列化(deserailization),即把文件中保存的对象,以流的方式读取出来,叫做读取对象,也叫对象的反序列。读取的文件保存的都是字节,使用字节流。

对象序列化的作用:在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。

       在翻看其它文章时发现底下有个评论很棒,概括得很全面:序列化是指把一个对象变成二进制内容,本质上就是一个byte[]数组。 为什么要把对象序列化呢?因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传输到远程,这样,就相当于把对象存储到文件或者通过网络传输出去了。 有序列化,就有反序列化,即把一个二进制内容(也就是byte[]数组)变回对象。有了反序列化,保存到文件中的byte[]数组又可以“变回对象,或者从网络上读取byte[]并把它“变回”对象。

 

二.协议与序列化的关系

关于协议:需要在发送请求的时候定一个边界,在请求收到的时候按照这个设定的边界进行数据分割,避免语义不一致的事情发生,而这个边界语义的表达,就是所谓的协议。

协议层是凌驾于序列化层之上的一层。协议层和序列化层之间还有传输层,动态代理层。

protocol 层主要用于配置 refer(发现服务) 和 exporter(暴露服务) 的实现方式,transport 层定义了传输的方式,codec 层诠释了具体传输过程中报文解析的方式,serialize 层负责将对象转换成字节,以用于传输,proxy 层负责将这些细节屏蔽。
它们的包含关系如下:protocol > transport > codec > serialize

<think>嗯,用户想了解C++ Workflow框架的架构设计。首先,我需要确认用户所说的Workflow框架具体指的是哪个,因为C++中有多个相关的框架,比如PaddlePaddle的Workflow,或者是其他开源项目。不过根据常见的资料,可能指的是由搜狗公司开源的那个Workflow框架,它在处理异步任务和网络通信方面比较有名。 接下来,我需要回忆下该框架的主要特点。根据之前的资料,这个框架强调高性能和低延迟,支持多协议,比如HTTP、Redis、MySQL等,并且采用任务流的方式来组织复杂的异步操作。架构设计方面,可能涉及事件循环、任务调度、资源管理这些模块。 然后,用户可能需要了解架构的分层结构。通常,这类框架会有网络层、任务管理层、资源管理层和组件扩展层。网络层处理协议实现和IO多路复用,任务管理层负责任务的创建、调度和依赖管理,资源管理层处理线程池和连接池,组件扩展层允许用户自定义协议或任务类型。 另外,用户可能对框架的核心机制感兴趣,比如如何实现异步操作、任务依赖关系的处理,以及调度策略。例如,事件循环驱动异步IO,任务可能分为不同的类型,如通信任务和计算任务,资源池化技术如连接池和线程池来减少开销。 还要考虑用户可能的后续问题,比如性能优化方法、适用场景、Boost.Asio的对比等。因此,在回答时需要结构清晰,分点说明,同时预留相关问题供用户参考。 需要确保使用正确的中文术语,避免翻译错误。同时,按照系统指令,数学公式要用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,但如果有提到算法复杂度的话需要注意格式。比如,时间复杂度可能涉及O(n)这样的表达,需要正确格式化。 最后,检查引用部分,如果有参考的资料需要添加引用标识,比如搜狗公司开源的Workflow文档或相关文章。确保回答真实可靠,结构清晰,帮助用户逐步理解架构设计的各个方面。</think>### C++ Workflow框架架构设计 C++ Workflow框架(如搜狗开源的Workflow框架)是个面向高性能网络编程和异步任务调度的轻量级框架,其核心设计目标是通过**事件驱动**和**资源池化**实现高并发低延迟[^1]。 #### 1. **分层架构** - **网络层** 基于Epoll/Kqueue实现多路复用IO,支持HTTP/1.1、HTTP/2、Redis、MySQL等协议,并通过`Protocol`抽象类提供统接口[^2]。 例如,HTTP任务通过状态机处理请求和响应: $$ \text{Request} \rightarrow \text{DNS解析} \rightarrow \text{连接建立} \rightarrow \text{数据收发} \rightarrow \text{回调处理} $$ - **任务管理层** 任务(`Task`)是基本调度单元,支持串行、并行和复杂依赖关系。通过`Series`类管理任务序列,例如: ```cpp WFHttpTask *task = WFTaskFactory::create_http_task("http://example.com", [](WFHttpTask *t) { /* 回调 */ }); SeriesWork *series = Workflow::create_series_work(task, nullptr); series->start(); ``` - **资源管理层** 使用线程池(计算任务)和连接池(网络任务)减少资源开销。例如,计算任务默认分配到`pthread`池,网络连接支持复用TCP链路[^3]。 - **组件扩展层** 允许用户通过继承`SubTask`定义新任务类型,或通过`Protocol`接口扩展自定义协议。 #### 2. **核心机制** - **异步调度** 基于事件循环(Event Loop)驱动,任务完成后通过回调通知用户,避免阻塞。 - **依赖控制** 通过`WFGoTask`和`WFCounterTask`实现任务依赖的灵活组合。 - **调度策略** 网络任务优先使用IO线程,计算任务分配到独立线程池,避免相互阻塞。 #### 3. **性能优化** - **零拷贝设计**:网络层直接操作内核缓冲区,减少内存复制。 - **协程友好**:支持通过`WFFacilities::async`协程结合,简化异步代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值