Update README_cn.md

This commit is contained in:
xiehan
2022-06-15 23:11:07 +08:00
committed by GitHub
parent 60af18408f
commit 1b1d00514a

View File

@@ -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 serverhttp_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)
#### 系统设计特点
#### 编程范式
我们认为,一个典型的后端程序由三个部分组成,并且完全独立开发。即:程序=协议+算法+任务流
程序 = 协议 + 算法 + 任务流
* 协议
* 大多数情况下用户使用的是内置的通用网络协议例如httpredis或各种rpc。
* 用户可以方便的自定义网络协议只需提供序列化和反序列化函数就可以定义出自己的client/server。
@@ -115,30 +115,29 @@ make
* 典型的任务流是一个闭合的串并联图。复杂的业务逻辑可能是一个非闭合的DAG。
* 任务流图可以直接构建,也可以根据每一步的结果动态生成。所有任务都是异步执行的。
基础任务,任务工厂与复合任务
* 我们系统中包含种基础任务通讯文件IOCPUGPU定时器,计数器。
* 一切任务都由任务工厂产生,并且在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)列表,看看是否能找到答案。