From 1b1d00514a9343942e49e25dfd8efd42444486b1 Mon Sep 17 00:00:00 2001 From: xiehan <52160700+Barenboim@users.noreply.github.com> Date: Wed, 15 Jun 2022 23:11:07 +0800 Subject: [PATCH] Update README_cn.md --- README_cn.md | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/README_cn.md b/README_cn.md index e89e1360..ccd6a06b 100644 --- a/README_cn.md +++ b/README_cn.md @@ -6,7 +6,7 @@ [![Platform](https://img.shields.io/badge/platform-linux%20%7C%20macos%20%7C%20windows-lightgrey.svg)](https://img.shields.io/badge/platform-linux%20%7C%20macos20%7C%20windows-lightgrey.svg) [![Build Status](https://img.shields.io/github/workflow/status/sogou/workflow/ci%20build)](https://github.com/sogou/workflow/actions?query=workflow%3A%22ci+build%22++) -搜狗公司C++服务器引擎,支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理超百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数C++后端开发需求。 +搜狗公司C++服务器引擎,编程范式。支撑搜狗几乎所有后端C++在线服务,包括所有搜索服务,云输入法,在线广告等,每日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数后端与嵌入式开发需求。 #### 你可以用来: * 快速搭建http服务器: ~~~cpp @@ -77,7 +77,7 @@ make * 计算任务 * [使用内置算法工厂:sort_task](docs/tutorial-07-sort_task.md) * [自定义计算任务:matrix_multiply](docs/tutorial-08-matrix_multiply.md) - * [更加简单的使用计算任务:go_task](docs/about-go-task.md) + * [更加简单的使用计算任务:go_task](docs/about-go-task.md)【推荐】 * 文件异步IO任务 * [异步IO的http server:http_file_server](docs/tutorial-09-http_file_server.md) * 用户定义协议基础 @@ -99,9 +99,9 @@ make * [异步kafka客户端:kafka_cli](docs/tutorial-13-kafka_cli.md) * [异步DNS客户端:dns_cli](docs/tutorial-17-dns_cli.md) -#### 系统设计特点 +#### 编程范式 -我们认为,一个典型的后端程序由三个部分组成,并且完全独立开发。即:程序=协议+算法+任务流。 +程序 = 协议 + 算法 + 任务流 * 协议 * 大多数情况下,用户使用的是内置的通用网络协议,例如http,redis或各种rpc。 * 用户可以方便的自定义网络协议,只需提供序列化和反序列化函数,就可以定义出自己的client/server。 @@ -115,30 +115,29 @@ make * 典型的任务流是一个闭合的串并联图。复杂的业务逻辑,可能是一个非闭合的DAG。 * 任务流图可以直接构建,也可以根据每一步的结果动态生成。所有任务都是异步执行的。 -基础任务,任务工厂与复合任务 -* 我们系统中包含六种基础任务:通讯,文件IO,CPU,GPU,定时器,计数器。 -* 一切任务都由任务工厂产生,并且在callback之后自动回收。 - * server任务是一种特殊的通讯任务,由框架调用任务工厂产生,通过process函数交给用户。 -* 大多数情况下,用户通过任务工厂产生的任务,都是一个复合任务,但用户并不感知。 +结构化并发与任务隐藏 +* 我们系统中包含五种基础任务:通讯,计算,文件IO,定时器,计数器。 +* 一切任务都由任务工厂产生,用户通过调用接口组织并发结构。例如串联并联,DAG等。 +* 大多数情况下,用户通过任务工厂产生的任务,都隐藏了多个异步过程,但用户并不感知。 * 例如,一次http请求,可能包含许多次异步过程(DNS,重定向),但对用户来讲,就是一次通信任务。 * 文件排序,看起来就是一个算法,但其实包括复杂的文件IO与CPU计算的交互过程。 * 如果把业务逻辑想象成用设计好的电子元件搭建电路,那么每个电子元件内部可能又是一个复杂电路。 + * 任务隐藏机制大幅减少了用户需要创建的任务数量和回调深度。 +* 任何任务都运行在某个串行流(series)里,共享series上下文,让异步任务之间数据传递变得简单。 -异步性和基于``C++11 std::function``的封装 -* 不是基于用户态协程。使用者需要知道自己在写异步程序。 +回调与内存回收机制 * 一切调用都是异步执行,几乎不存在占着线程等待的操作。 - * 虽然我们也提供一些便利的半同步接口,但并不是核心的功能。 -* 尽量避免派生,以``std::function``封装用户行为,包括: +* 显式的回调机制。用户清楚自己在写异步程序。 +* **通过一套对象生命周期机制,大幅简化异步程序的内存管理** + * 任何框架创建的任务,生命周期都是从创建到callback函数运行结束为止。没有泄漏风险。 + * 如果创建了任务之后不想运行,则需要通过dismiss()接口删除。 + * 任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过``std::move()``把需要的数据移走。 + * 项目中不使用任何智能指针来管理内存。代码观感清新。 +* 尽量避免用户级别派生,以``std::function``封装用户行为,包括: * 任何任务的callback。 * 任何server的process。符合``FaaS``(Function as a Service)思想。 - * 一个算法的实现,简单来讲也是一个``std::function``。但算法也可以用派生实现。 - -内存回收机制 -* 任何任务都会在callback之后被自动内存回收。如果创建的任务不想运行,则需要通过dismiss方法释放。 -* 任务中的数据,例如网络请求的resp,也会随着任务被回收。此时用户可通过``std::move()``把需要的数据移走。 -* SeriesWork和ParallelWork是两种框架对象,同样在callback之后被回收。 - * 如果某个series是parallel的一个分支,则将在其所在parallel的callback之后再回收。 -* 项目中不使用``std::shared_ptr``来管理内存。 + * 一个算法的实现,简单来讲也是一个``std::function``。 + * 如果深入使用,又会发现一切皆可派生。 # 使用中有疑问? 可以先查看[FAQ](https://github.com/sogou/workflow/issues/170)和[issues](https://github.com/sogou/workflow/issues)列表,看看是否能找到答案。